抛出并捕获异常后继续执行代码

Gur*_*epS 29 c# exception-handling exception

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

例如,请使用以下代码:

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)
            {
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

在单步执行时捕获异常后,程序将停止运行.我怎么还能继续执行?

编辑:我特别指的是Console.WriteLine(@class)行; 似乎没有被击中,因为当我在调试模式下运行它时,程序退出调试模式.我想跑到这条线并停下来.

谢谢

Viv*_*ath 35

好吧,你在catch块之后没有任何代码,所以程序会停止运行.不确定你要做什么.

以下内容应证明程序不会简单地在catch块之后"停止" .catch如果有要执行的代码,它将在块之后执行代码:

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!");
}
Run Code Online (Sandbox Code Playgroud)

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

UPDATE

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

如果你想点击这一Console.WriteLine行,那么你不应该在方法的开头显式抛出异常.

  • 这些随机开车降票是怎么回事? (2认同)

dth*_*rpe 10

听起来你想要可恢复的例外.C#没有做可恢复的异常,我怀疑CLR是否支持它们.

抛出异常的目的是在调用环境中的某些东西(参数,对象状态,全局状态)使函数的操作无法或无效时,中止函数和整个操作(调用堆栈).例如,将零参数传递给需要通过该参数划分数量的函数.除以零将不会产生有意义的结果,如果这是函数的唯一目的,那么函数也不能返回有意义的结果.所以,抛出异常.这将导致执行跳转到最近的catch或最终阻塞调用堆栈.没有返回抛出异常的函数.

如果要在调试器中单步执行代码以跟踪Console.WriteLine()调用,则需要从代码中删除抛出新的NotSupportedException()行并重新编译.


Pat*_*ick 8

如果您担心方法中会抛出异常,但您希望该方法继续,请在方法内添加一个错误处理程序.

class Test 
{ 
    public void s() 
    { 
        try
          {
              // Code that may throw an exception
              throw new NotSupportedException();
          } 
          catch(Exception ex)
          {
              // Handle the exception - log?, reset some values?
          }
          string @class = "" ; 
          Console.WriteLine(@class); 
          Console.ReadLine(); 
    } 
} 
Run Code Online (Sandbox Code Playgroud)

您还可以返回bool或其他值来指示状态.