c# - 在抛出并捕获异常后恢复执行代码

标签 c# exception exception-handling

如何在抛出异常后恢复代码执行?

例如,拿下面的代码:

namespace ConsoleApplication1
{
    public class Test
    {
        public void s()
        {
            throw new NotSupportedException();
            string @class = "" ;
            Console.WriteLine(@class);
            Console.ReadLine();
        }
    }

    public class Program
    {
        public static void Main(string[] args)
        {
            try
            {
                new Test().s();
            }
            catch (ArgumentException x)
            {
            }
            catch (Exception ex)
            {
            }
        }
    }
}

单步执行时捕捉到异常后,程序将停止运行。我怎么还能继续执行呢?

编辑:我的具体意思是 Console.WriteLine(@class);似乎没有被击中,因为当我在 Debug模式下运行它时,程序退出 Debug模式。我想跑到这条线并停在那里。

谢谢

最佳答案

嗯,在 catch block 之后没有任何代码,所以程序将停止运行。不确定您要做什么。

以下应该证明程序不会在 catch block 之后简单地“停止”。如果有要执行的代码,它将在 catch block 之后执行代码:

static void Main(string[] args)
{
    try
    {
        new Test().s();
    }
    catch (ArgumentException x)
    {
        Console.WriteLine("ArgumentException caught!");
    }
    catch (Exception ex) 
    { 
        Console.WriteLine("Exception caught!");
    }

    Console.WriteLine("I am some code that's running after the exception!");
}

代码将根据捕获的异常打印适当的字符串。然后,它会在最后打印 I am some code that's running after the exception!

更新

在您的编辑中,您询问了为什么 Console.WriteLine(@class); 似乎没有被击中。原因是您明确s() 方法的第一行中抛出异常;随后的任何内容都将被忽略。当遇到异常时,执行停止并且异常在调用堆栈中向上传播,直到适当的处理程序可以处理它(这可能是与 try 相对应的 catch block 将有问题的语句包装在同一个方法中,或者它可能是调用堆栈更上层的 catch block 。如果没有找到合适的处理程序,程序将以堆栈跟踪终止 [至少在Java - 不确定在 C# 中是否会发生同样的情况])。

如果你想点击 Console.WriteLine 行,那么你不应该在方法的开头明确抛出异常。

关于c# - 在抛出并捕获异常后恢复执行代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3007608/

相关文章:

java - @ExceptionHandler(Exception.class) 不处理所有类型的异常

c# - 在另一个文本框中显示一个文本框中的字符

c# - 替换 "\"字符时出现问题

winforms - 由于Microsoft.ReportingServices.Rendering.RichText.CachedFont GetFont,ReportViewer崩溃

python - 热切地评估 Python 中的 bool 表达式

windows - 服务无法启动 : can't load assembly

.net - 异常处理 : Is finally executed after throw?

c# - 在 C# 中使用 DataContext 和 System.Data.SQLite 创建数据库

c# - 在自动化测试构建期间如何使用 BACPAC 恢复 Azure 数据库?

java - java中处理多个异常