C#中关于try-catch的异常捕获问题
Posted 程序员小猩猩
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C#中关于try-catch的异常捕获问题相关的知识,希望对你有一定的参考价值。
在平日工作里,我们的有时候需要对代码进行异常捕获,那么我们就需要了解到try-catch语句。
首先,我们通过如下面代码可以知道throw是将该异常抛出,即Test()中存在异常,由Test()捕获并抛出,并在Main中接收并处理。在Test()中的throw下方的Console.WriteLine并未执行。那么我们可以得出如下结论:
结论1:throw中的异常被抛出后,该异常被外层调用处接收。且throw下方代码不被执行。
示例一
其次,我们将示例一中的第31行进行修改,那么得出如下结果,Main的catch没有执行,原因是异常被Test中的catch捕获,并处理了,由于自行处理了,且并未将该异常往外抛,则出现Main中无任何异常捕获。
结论2:catch捕获后,若自行处理,则不会对外有任何影响;若通过throw往外抛,则会由外层再次捕获到。
示例二
接着,我们在示例二再做修改,如下图所示,Test()捕获异常后,先自行处理,再通过throw直接抛出,我们会发现真正错误的第26行的堆栈信息被丢失了。而外层Main中只报了第32行处有错,并未直接指出错误的本身是第26行导致的。
结论3:当一个异常由throw直接被抛出,那么再次接收到的异常会存在堆栈信息的缺失。
示例三:
最后,我们将示例三中的代码进行修改,如下图所示,我们在Test()中的catch中捕获到异常后,在throw抛出时,我们创建了新的自定义异常new Exception("错误的堆栈信息:",e),并将原始的异常作为innerException,所以异常信息中包含了多个层次的异常信息。
结论:当异常信息通过throw抛出后,我们应该采用 new Exception(string message, Exception innerException)方式抛出,这样保证堆栈信息的完整,能快速定位出异常的具体位置。
using System;
namespace ExceptionDemo
{
class Program
{
static void Main(string[] args)
{
try
{
Test();
}
catch (Exception e)
{
Console.WriteLine("1=====================");
Console.WriteLine(e);
Console.WriteLine("1=====================");
}
Console.ReadKey();
}
public static void Test()
{
try
{
int i = 0;
i = 10 / i;
}
catch (Exception e)
{
Console.WriteLine("2=====================");
Console.WriteLine(e);
throw new Exception("错误的堆栈信息:",e);
Console.WriteLine("2=====================");
}
}
}
}
以上是关于C#中关于try-catch的异常捕获问题的主要内容,如果未能解决你的问题,请参考以下文章