Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/340.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 重新抛出异常并再次捕获_C#_Exception_Exception Handling - Fatal编程技术网

C# 重新抛出异常并再次捕获

C# 重新抛出异常并再次捕获,c#,exception,exception-handling,C#,Exception,Exception Handling,我正在使用C,不知道是否可以从try/catch中重新调用异常,并让稍后的catch语句重新对其进行匹配 try { // 1. Try some operation //Failed operations // 2. Throw an exception throw new IOException("I tried my best"); } catch(IOException) { // 3. Try some specific recovery operation

我正在使用C,不知道是否可以从try/catch中重新调用异常,并让稍后的catch语句重新对其进行匹配

try {
// 1. Try some operation
    //Failed operations

// 2. Throw an exception
    throw new IOException("I tried my best");
} catch(IOException) {
// 3. Try some specific recovery operation
    //Failed operations

//4. Rethrow and try again
    throw;
}

... Some more specific exception handlers

} catch(Exception) {
// 5. Re-caught here as a last-ditch effort, generic recovery operation
    //Process here
} finally {
    //...
}

仅当catch语句引发另一个try/catch时,例如:

try{

    ...

   try{
        ...
   }
   catch(ExceptionA a)
   {
      throw;
   }
   catch(Exception e)
   {
       //will not not catch ExceptionA (rethrow or not)
   }
}
catch(ExceptionA a)
{
    //this would catch the re-throw
}
catch( Exception e)
{
}
相反,为什么不捕获常规异常,然后对异常类型进行case处理呢

try{
        ...
   }
   catch(Exception e)
   {
       if (e is ExceptionA){
            ...
       }
   }
或者把逻辑放在最后


您的代码应该可以工作,但是真正的问题是,应该使用异常来通知外部代码部分发生错误的事实。在try部分手动抛出异常并在下面的catch部分捕获它是没有意义的。如果您知道无法处理某些IO操作,请立即使用If-else语句进行处理。使用try-catch无疑是一种糟糕、低效的做法。

不确定,因为变量的作用域,因为c不是我现在使用的语言,因为新添加的变量可能会产生副作用,因为它看起来不是一种好的编码做法,但这行得通吗:

try{
     ...
}
catch(ExceptionA a)
{
   exception = a;  // "Store" the exception in a variable
}
catch(Exception e)
{
    //will not not catch ExceptionA (rethrow or not)
}

try
{
    if (exception)
        throw exception;  // kind of rethrow if variable is set
}
catch(ExceptionA a)
{
    //this would catch the re-throw
}
catch( Exception e)
{
}

您可以嵌套try/catch块。回答:是!但只在另一个范围内:不在同一个try-catch中,而是在更高的级别确定。。。这就是我害怕的谢谢。如果我觉得很吝啬,我可以用gotos。。。但我没有感觉到为什么不捕获异常并将异常类型转换为case?如果我完成并在case语句之间跳转,这是一个可能的解决方法。我会这样做,但是切换式总是给我有趣的感觉,因为我来自C++背景,这是一个特别的不不。你不需要重新扔,是吗?你为什么不在那里处理呢?或者在finally中添加一个布尔值,如果发生异常,请执行某些操作……这是一个简单的示例,不是我实际代码的快照。我也不同意这是一种糟糕的做法,因为try/catch语句正在做它们应该做的事情,将主代码与错误处理条件分开。这两项行动不应混为一谈。另外,如果您关心效率,在这种情况下,这一点可以忽略不计,因为当抛出异常时,几乎没有堆栈展开。@spryno724否,try/catch不应该处理您刚才在try部分中创建的错误。它应该处理内部错误。与简单的if-else语句相比,try/catch有哪些可能的优势?我明白你现在所说的。。。是的,我同意这在实践中是个坏主意。这只是一个传达想法的简单例子。
try{
     ...
}
catch(ExceptionA a)
{
   exception = a;  // "Store" the exception in a variable
}
catch(Exception e)
{
    //will not not catch ExceptionA (rethrow or not)
}

try
{
    if (exception)
        throw exception;  // kind of rethrow if variable is set
}
catch(ExceptionA a)
{
    //this would catch the re-throw
}
catch( Exception e)
{
}