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往外抛,则会由外层再次捕获到。

示例二

C#中关于try-catch的异常捕获问题

        

        接着,我们在示例二再做修改,如下图所示,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的异常捕获问题的主要内容,如果未能解决你的问题,请参考以下文章

C#中如何处理异常?怎么使用try-catch语句?

异常和TCP通讯

Java异常处理机制

java异常 throw和try-catch的关系

C#传智:分支Switch与循环While(第四天)

php:try-catch 未捕获所有异常