2012-06-06 189 views
1

我有類似的代碼如下:不拋出異常?

try{ 
    func1(); 
} 
catch(Exception e){ 
    /Do something 
} 


static func1(){ 
    func2(); 
} 

static func2(){ 
    //Exception thrown here 
    System.IO.StreamReader file = new System.IO.StreamReader(filePath); 
} 

當異常是由代碼FUNC2行()我得到的catch子句中沒有通知拋出。我沒有明確地拋出任何東西,我只是定期的函數聲明是靜態的 - 在任何地方都不會出現「throw」。

爲什麼不是異常向上傳播到catch語句?

+0

把'try/catch'放在'func2'的周圍。另外你爲什麼要通過'func1'來調用'func2'?爲什麼不直接調用'func2'? –

+0

如果沒有異常被明確拋出,你怎麼知道'func2'會導致異常? –

+0

您是否試圖從'func2'中顯式拋出'Exception'? –

回答

1

例外的地方會'冒泡'直到它被抓到或崩潰你的應用程序。

最好的辦法是使用調試器。確保已將它設置爲停止HANDLED異常(調試/異常/檢查公共語言運行時異常中的'Thrown'框)。

現在運行您的代碼。如果func2拋出一個異常 - 你的代碼將被破壞;不管它是否被處理。您可以瀏覽代碼並查看正在處理的內容。

6

不,代碼很好。你的真實代碼中有些東西是你沒有向我們展示的。這異常傳播罰款:

using System; 

static class Program { 
    static void Main() { 
     try{ 
      func1(); 
     } catch(Exception e) { 
      // works fine: FileNotFoundException 
      Console.WriteLine(e); 
     } 
    } 
    static void func1(){ 
     func2(); 
    }  
    static void func2() { 
     string filePath = "doesnot.exist"; 
     System.IO.StreamReader file = new System.IO.StreamReader(filePath); 
    } 
} 

考生:

  • 任何涉及一個try的嫌疑 - 高音檢查
  • 任何涉及線程可能有例外,否則
+0

馬克就在這裏。 – Sunny

+0

我對此解決方案有疑問。從我所瞭解的情況來看,我認爲如果Func2出現異常,它就會死亡並結束。我一直這樣做的方式是,我會把一個Try Catch圍繞Func2和拋出異常進行捕獲。這樣它就會升到下一個級別,這將是Try Func2被調用的地方。在那裏,我還會拋出異常,它會將其帶到函數1被調用的地方。現在它處於頂層,並且會在func1調用中執行任何代碼。你能解釋一下如何在不拋出異常的情況下工作嗎?謝謝 – Tony318