让我们看一下这个简单的try / catch示例......
try
{
// User inputs path of a file
if(!ValidPath)
throw new InvalidPathException();
}
catch InvalidPathException e
{
// Log error
// Re-throw the error.
throw;
}
夫妻问题。两者都可能是简单的答案。
答案 0 :(得分:2)
是的,任何包装器/下一个catch块都会重新捕获catch块中的throw语句。
使用Basic Goto:like语句修改程序流是一种糟糕的编程习惯,因此不建议返回原始代码块(这也是不切实际的)。此外,您始终尝试处理自调试器输出和放大以来它们发生位置的异常。堆栈跟踪将以这种方式提供更多信息。
答案 1 :(得分:1)
每个try块可以有多个catch,但只使用一个。它将捕获最接近的异常。如果然后抛出异常,它将完全保留此try块,只有周围的catch才能处理重新抛出的异常。
答案 2 :(得分:0)
1.捕获中的垃圾回去检查下一个捕获,然后检查下一个,依此类推?
将仅选择与任何try块中的异常匹配的第一个catch块。如果catch块重新抛出异常,那么它将被传递到外部try / catch块(如果有),或者调用堆栈到调用堆栈中的任何其他try / catch块。 (它不会被同一个try / catch块中的另一个catch块捕获。)
2.有没有办法回到原来的尝试?或者那是不好的编程习惯?
在C#中,您无法返回抛出异常的位置,如果这是您要求的。如果你想再次尝试整个try块,那么你就把它放在一个循环中。这要求您不要重新抛出异常,因为这会将执行发送出方法。
请参阅this question的答案,了解重试try块的示例。
答案 3 :(得分:-1)
捕获中的抛出是否会返回并检查下一个捕获,然后是下一个捕获,依此类推?
答:不,不是。只能抓住阻止。有没有办法回到原来的尝试?或者那是不好的编程习惯?
答:是的,很少有不同的策略/黑客攻击。参考1:Try-catch every line of code without individual try-catch blocks
示例:
public delegate void VoidDelegate();
public static class Utils
{
public static void Try(VoidDelegate v) {
try {
v();
}
catch {}
}
}
Utils.Try( () => WidgetMaker.SetAlignment(57) );
Utils.Try( () => arrayname["Title"] = txtTitle.Text );
Utils.Try( () => objectname.Season(true, false) );
Utils.Try( () => (Session["CasseroleTracker"]).Seasoned = true );
另一种方法是使用GOTO statement:
另一种方法是使用On Error Resume Next
答案 4 :(得分:-2)
var anyway = true;
while(anyway)
{
try
{
do somthing
...
...
...
if no errors anyway = false
}
catch
{
somthing wrong!
}
}
)