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行,那么你不应该在方法的开头显式抛出异常.
dth*_*rpe 10
听起来你想要可恢复的例外.C#没有做可恢复的异常,我怀疑CLR是否支持它们.
抛出异常的目的是在调用环境中的某些东西(参数,对象状态,全局状态)使函数的操作无法或无效时,中止函数和整个操作(调用堆栈).例如,将零参数传递给需要通过该参数划分数量的函数.除以零将不会产生有意义的结果,如果这是函数的唯一目的,那么函数也不能返回有意义的结果.所以,抛出异常.这将导致执行跳转到最近的catch或最终阻塞调用堆栈.没有返回抛出异常的函数.
如果要在调试器中单步执行代码以跟踪Console.WriteLine()调用,则需要从代码中删除抛出新的NotSupportedException()行并重新编译.
如果您担心方法中会抛出异常,但您希望该方法继续,请在方法内添加一个错误处理程序.
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或其他值来指示状态.