尝试/捕获-返回原始尝试

| 让我们看一下这个简单的try / catch示例...
try
{
    // User inputs path of a file
    if(!ValidPath)
        throw new InvalidPathException();
}
catch InvalidPathException e
{
    // Log error
    // Re-throw the error.
    throw;     
}
几个问题。两者可能都是简单的答案。 渔获量是否回溯并检查下一个渔获,然后检查下一个,依此类推? 有没有办法回到最初的尝试?还是那不好的编程习惯?     
已邀请:
是的,catch块中的throw语句将由任何包装器/下一个catch块重新捕获。 使用Basic Goto:like语句修改程序流是一种不良的编程习惯,因此建议不要返回到原始代码块(这也是不切实际的)。同样,您总是尝试处理异常,因为调试器的输出和堆栈跟踪将以这种方式提供更多信息。     
每个try块可以有多个catch,但是只会使用一个。它将捕获最接近的异常。如果随后抛出异常,它将完全离开该try块,只有周围的捕获程序才能处理重新抛出的异常。     
  1.渔获量是否回溯并检查下一个渔获量,然后检查下一个渔获量,依此类推? 将仅选择与任何try块中的异常匹配的第一个catch块。如果catch块抛出异常,则将其传播到外部try / catch块(如果有),或者将调用堆栈传播到调用堆栈中的任何其他try / catch块。 (它不会被同一try / catch块中的另一个catch块捕获。)   2.有没有办法回到原来的尝试?还是那不好的编程习惯? 在C#中,如果您要问的是,您不能返回引发异常的位置。如果您想再次尝试整个try块,则只需将其放入循环中即可。但是,这要求您不要抛出异常,因为这会将执行发送到方法之外。 有关重试try块的示例,请参见此问题的答案。     
渔获量是否回溯并检查下一个渔获,然后检查下一个,依此类推? 答:不,不是。仅捕获块。 有没有办法回到最初的尝试?还是那不好的编程习惯? 答:是的,很少有不同的战术/技巧。 参考文献1:尝试捕获每一行代码而没有单独的try-catch块 例:
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:
参考2:http://social.msdn.microsoft.com/Forums/en-US/Vsexpressvcs/thread/2294d2ce-e6ae-4152-b022-61aa2ae9372d/ 另一种方法是用
On Error Resume Next
参考3:http://msdn.microsoft.com/en-us/library/5hsw66as.aspx     
var anyway = true;
while(anyway)
{
try
{
do somthing
...
...
...
if no errors anyway = false
}
catch
{
   somthing wrong!
}
}
;)     

要回复问题请先登录注册