C# Try/Catch-返回原始Try

C# Try/Catch-返回原始Try,c#,exception-handling,try-catch,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; } 两个问题。这两个答案可能都很简单 抛接球是否会返回并检查下一个

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

try
{
    // User inputs path of a file
    if(!ValidPath)
        throw new InvalidPathException();
}
catch InvalidPathException e
{
    // Log error
    // Re-throw the error.
    throw;     
}
两个问题。这两个答案可能都很简单

  • 抛接球是否会返回并检查下一个接球,然后是下一个接球,依此类推
  • 有没有办法回到最初的尝试?或者这是一种糟糕的编程实践

  • 每个try块可以有多个捕捉,但只能使用一个捕捉。它将捕获最接近的异常。如果您随后抛出异常,它将完全离开这个try块,并且只有周围的catch能够处理rethrown异常

  • 是,catch块中的throw语句将被任何包装器/下一个catch块重新捕获

  • 使用基本Goto:like语句修改程序流是一种糟糕的编程实践,因此不建议返回原始代码块(这也是不切实际的)。此外,您总是尝试在异常发生的位置附近处理异常,因为调试器输出和堆栈跟踪将以这种方式提供更多信息

  • 1.抛接球是否会返回并检查下一个接球,然后是下一个接球,依此类推

    只有与中的任何try块的异常匹配的第一个catch块将被选择。如果catch块重新引发异常,则将其向上传播到外部try/catch块(如果有),或向上传播到调用堆栈中的任何其他try/catch块。(它不会被同一try/catch块中的另一个catch块捕获。)

    2.有没有办法回到最初的尝试?或者这是一种糟糕的编程实践

    在C#中,如果您要求返回异常抛出的位置,则无法返回该位置。如果您想重新执行整个try块,那么您只需将其放入一个循环中。但是,这要求您不要重新引发异常,因为这样会将执行发送到方法之外

    有关重试try块的示例,请参见的答案

  • 抛接球是否会返回并检查下一个接球,然后是下一个接球,依此类推

    答:没有。仅限挡块

  • 有没有办法回到最初的尝试?或者这是一种糟糕的编程实践

    答:是的,很少有不同的战术/技巧

  • 参考文献1:

    例如:

    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语句:

    参考文献2:

    另一种方法是在错误恢复下一步时使用

    参考文献3:


    )()

    您可以更清楚地了解“下一个”catch块是什么。使用
    goto
    语句从外部输入块(例如
    try
    block)实际上是非法的。因此,这不仅仅是一个糟糕的编程实践。修改代码流不是不可能的,而是非常不切实际的,所以是的,你是对的。嗯。。。您可以在(条件){try{do stuff}catch(){}}
    时执行类似于
    的操作,但是您需要小心不要进入无限循环。虽然不是“try-catch-retry”,但您可以到达那里。您不能从块外转到try块内的标签。On Error是Visual Basic。@recursive:您可以从同一捕获转到try块内的标签。你不了解问题和我的答案,也不知道细节。检查这本实际手册:您提供的是一个指向有关Visual Basic而不是C#的文档的链接。我真的试过了。编译时错误消息如下:goto语句范围内没有这样的标签“asdf”。
    
    var anyway = true;
    while(anyway)
    {
    try
    {
    do somthing
    ...
    ...
    ...
    if no errors anyway = false
    }
    catch
    {
       somthing wrong!
    }
    }