gpt4 book ai didi

c# - Roslyn 脚本引擎在用作委托(delegate)时不会抛出运行时异常

转载 作者:行者123 更新时间:2023-11-30 23:08:56 24 4
gpt4 key购买 nike

我在使用 Roslyn 脚本引擎时遇到了问题。当我在委托(delegate)中运行脚本时,我没有得到任何异常处理。

按预期工作的测试:

string script = @"var a=0; var b=2/a;";
var runner = CSharpScript.Create<object>(script);
var errors = runner.Compile();
Assert.IsTrue(errors.IsEmpty);

try
{
runner.RunAsync();
Assert.Fail("Where is the exception");
}
catch (System.Exception)
{
// everything is OK! Error thrown...
}

结果:无断言。抛出异常。

这是使用委托(delegate)对象的文本:

单元测试:

string script = @"var a=0; var b=2/a;";
var runner = CSharpScript.Create<object>(script);
var errors = runner.Compile();
var delegat = runner.CreateDelegate();
Assert.IsTrue(errors.IsEmpty);

try
{
delegat();
Assert.Fail("Where is the exception?");
}
catch (System.DivideByZeroException)
{
// everything is OK! Error thrown...
}

我收到了失败消息并且没有抛出异常。

我们缓存委托(delegate)以加快编译速度,并且在测试期间我们看到没有抛出运行时异常。所以我写了测试来重现这种情况。

我在文档中找不到任何描述调用期间没有抛出异常的提示。

有人能给我指点或提示为什么会这样吗?

最佳答案

您的代码有两个问题:

  1. 在第一个版本中,您正在捕获 Exception ,这意味着当 Assert.Fail到达并抛出AssertionException ,然后捕获并忽略该异常。

    这意味着 RunAsync 之间没有区别并在这里委托(delegate),他们都不会抛出 DivideByZeroException .

  2. 两者都是 RunAsyncScriptRunner<T>委托(delegate)返回Task 。这意味着要实际等待它们完成或观察任何异常,您需要使用 await .执行此操作后,您将看到 DivideByZeroException您所期待的。

关于c# - Roslyn 脚本引擎在用作委托(delegate)时不会抛出运行时异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46182755/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com