2013-04-26 104 views
1

我的第一個問題在這裏,我沒有很大的英語,所以請多多包涵,重新拋出try塊C#異常

我寫一個應用程序,允許用戶編寫腳本接口與「司機」 ,腳本和驅動程序都是獨立的類庫dll。這些類通過傳遞的回調代理進行通信,所以在編譯時它們不被鏈接。

例如:(腳本) - >(將它處理 通訊程序) - >(司機)

現在我的問題是:

當腳本執行通過的方法一個委託,它拋出一個異常,異常是冒泡備份到腳本和用戶可以處理它,如果他們在try-catch塊中捕獲它,如果不是,該異常必須在我的程序中捕獲。

它工作正常,像這樣的,但我不知道這是正確的方式去:

delegate object ScriptCallbackDelegate(string InstanceName, string MethodName, object[] Parameters); 

static private object ScriptCallbackMethod(string InstanceName, string MethodName, object[] Parameters) 
{ 
    try 
    { 
     return InterfaceWithDriver(InstanceName, MethodName, Parameters); 
    } 
    catch(Exception e) 
    { 
     try 
     { 
      throw; 
     } 
     catch 
     { 
      Console.WriteLine("Script did not handle exception: " + e.Message); 
      return null; 
     } 
    } 

} 
+0

嘗試在此查找您的答案[鏈接](http://stackoverflow.com/questions/7890461/how-to-rethrow-a-prior-exception-from-inside-a-nested-try-catch-block -c),希望你在這裏找到你的答案。希望它有效。 – Rahul 2013-04-26 06:57:04

回答

3
catch (Exception e) 
{ 
    try 
    { 
     throw; 
    } 
    catch 
    { 
     Console.WriteLine("Script did not handle exception: " + e.Message); 
     return null; 
    } 
} 

在語義上等同於:

catch (Exception e) 
{ 
    Console.WriteLine("Script did not handle exception: " + e.Message); 
    return null; 
} 

的腳本是永遠看到它內在的throw - 它正在被你的C#代碼捕獲。

1

在您的代碼中導致的異常永遠不會讓它離開它,例如,在下面你可以看到類似的行爲。

using System; 

namespace Code.Without.IDE 
{ 
    public static class TryCatch 
    { 
     public static void Main(string[] args) 
     { 
      try 
      { 
       try 
       { 
        throw new Exception("Ex01"); 
       } 
       catch(Exception ex) 
       { 
        try 
        { 
         throw; 
        } 
        catch 
        { 
         Console.WriteLine("Exeption did not go anywhere"); 
        } 
       } 
       Console.WriteLine("In try block"); 
      } 
      catch 
      { 
       Console.WriteLine("In catch block"); 
      } 
     } 
    } 
} 

生成以下的輸出:

------ C:\ ABHI \代碼\ CSHARP \沒有IDE \ TryCatch.exe

Exeption沒有去

在試塊

------程序返回0