2013-04-26 102 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