C# 重新抛出异常并再次捕获
我正在使用C,不知道是否可以从try/catch中重新调用异常,并让稍后的catch语句重新对其进行匹配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
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)
{
}