繁体   English   中英

无法捕获Invoke在编译表达式上抛出的异常

[英]Can't catch exception thrown by Invoke on a compiled expression

在课堂里:

private Func<T, object> pony;

在我的功能:

object newValue;
try {
  newValue = pony.Invoke(model as T); // This is the line where I get an exception!
} catch (Exception exception) {
  // This code is never run, even though I get an exception two lines up!
  if(exception is DivideByZeroException) throw new DivideByZeroException("Division by zero when calculating member " + GetMemberName(), exception);
  throw;
}

我希望在抛出它们时会出现异常,但是我在newValue = pony.Invoke(model as T);行上得到了DivideByZeroException newValue = pony.Invoke(model as T); 为什么是这样? 我能为此做些什么吗?

这是在Cassini中运行的asp.net mvc2应用程序。

如果我在Visual Studio 2008中选择“开始调试”,则会捕获错误并使用额外信息重新生成错误!

问题是我显然不了解内部异常是如何工作的。 异常被捕获,但之后只显示内部异常,这是一个完全不同的问题。

以下代码适用于我(这是在C#控制台应用程序中,虽然我不知道为什么它与ASP.NET不同):

class Program
{
    static void Main(string[] args)
    {
        var foo = new Foo<int>();
        try
        {
            Console.WriteLine("Calling function");
            foo.DoStuff(5);
        }
        catch(Exception ex)
        {
            Console.WriteLine("Caught exception: " + ex.ToString());
        }
        finally
        {
            Console.WriteLine("In finally block");
        }
    }
}

class Foo<T>
{
    private Func<T, object> pony;

    public Foo()
    {
        this.pony = m =>
        {
            throw new DivideByZeroException("Exception!");
        };
    }

    public object DoStuff(T o)
    {
        return this.pony.Invoke(o);
    }
}

这将按预期将命令行中的异常内容打印出来。

从编译表达式抛出的异常通常由try .. catch构造处理,所以我希望你的代码中还有一些其他问题。 如果您尝试以下代码,它的行为符合预期:

Expression<Func<int, int>> f = x => 10 / x;
Func<int, int> fcompiled = f.Compile();
try {
  Console.WriteLine(fcompiled(0));
} catch (DivideByZeroException e) {
  Console.WriteLine("Divison by zero");
}

作为旁注,您应该使用单独的catch来处理DivideByZeroException (就像我在我的示例中所做的那样)。 这是一种更清晰,更推荐的方法来捕获不同类型的异常。

在没有调试的情况下运行应用程序时是否可以检查异常是否真的未处理(例如通过向catch块添加一些调试打印)? 运行应用程序时会打印什么异常(毕竟,您的代码在任何情况下都会重新抛出一些异常,因此输出可能不清楚)。

好吧,在编译表达式中执行的代码显然会生成DivideByZeroException。 有些东西试图除以零。 那你还期待什么呢?

请注意,调试器(尤其是VS)可能会在异常时中断,因此您应该确保继续运行应用程序,它应该很好地到达catch块。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM