2010-02-26 69 views
2

在類:不能捕獲的異常被拋出調用一個已編譯的表達

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。爲什麼是這樣?我能做點什麼嗎?

這是在Cassini目前運行的asp.net mvc2應用程序中。

如果我選擇在Visual Studio 2008中啓動調試,錯誤被抓住並用額外的信息重新拋出!

問題是,我顯然還沒有明白怎麼例外內工作。異常被捕獲,但只顯示內部異常,這完全是另一個問題。

+0

我投票結束,因爲問題不是它看起來那樣。因此這個問題是無關緊要的。 – svinto 2010-02-26 12:41:53

+0

+1爲小馬.. – snicker 2010-03-08 23:21:37

回答

1

例外從編譯表達拋出由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"); 
} 

作爲一個側面說明,你應該使用處理DivideByZeroException單獨catch(正如我在我的例子一樣)。這是一種更清潔並且推薦的方式來捕捉不同類型的例外情況。

你可以檢查沒有(通過添加一些調試打印到catch塊爲例)調試運行應用程序時的異常是否是真的未處理?運行應用程序時會打印什麼異常(畢竟,在任何情況下,您的代碼都會拋出一些異常,所以輸出可能不清晰)。

+0

謝謝,問題是我將原始異常作爲內部異常拋出,然後只顯示內部異常。我顯然不明白內部例外是如何工作的。感謝您的幫助! (此外,我轉而捕捉所有異常,以檢查是否有任何事情被捕獲。) – svinto 2010-02-26 12:38:55

0

那麼,在已編譯的表達式執行的代碼明顯產生DivideByZeroException,右。有些東西試圖在那裏除以零。那麼你還期望什麼?

請注意,調試(尤其VS)可以打破例外,所以你應該確保繼續運行的應用程序,它應該達到的catch塊就好了。

+0

我希望它能讓我抓住那個異常,並用更多的信息重新拋出它! – svinto 2010-02-26 12:00:50

1

下面的代碼爲我工作(這是在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); 
    } 
} 

這種打印出的內容如預期的那樣,命令行異常。

+0

我顯然不明白內部異常是如何工作的。感謝您的幫助! – svinto 2010-02-26 12:39:22

相關問題