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

时间:2011-04-14 14:59:41

标签: c# exception-handling try-catch

让我们看一下这个简单的try / catch示例......

try
{
    // User inputs path of a file
    if(!ValidPath)
        throw new InvalidPathException();
}
catch InvalidPathException e
{
    // Log error
    // Re-throw the error.
    throw;     
}

夫妻问题。两者都可能是简单的答案。

  1. 捕获中的投掷是否会返回并检查下一个捕获,然后是下一个捕获,依此类推?
  2. 有没有办法回到原来的尝试?或者是糟糕的编程习惯?

5 个答案:

答案 0 :(得分:2)

  1. 是的,任何包装器/下一个catch块都会重新捕获catch块中的throw语句。

  2. 使用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. 捕获中的抛出是否会返回并检查下一个捕获,然后是下一个捕获,依此类推?

    答:不,不是。只能抓住阻止。

  2. 有没有办法回到原来的尝试?或者那是不好的编程习惯?

    答:是的,很少有不同的策略/黑客攻击。

  3. 参考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:

    参考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

答案 4 :(得分:-2)

var anyway = true;
while(anyway)
{
try
{
do somthing
...
...
...
if no errors anyway = false
}
catch
{
   somthing wrong!
}
}