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

        在平日工作里,我们的有时候需要对代码进行异常捕获,那么我们就需要了解到try-catch语句。
        首先,我们通过如下面代码可以知道throw是将该异常抛出,即Test()中存在异常,由Test()捕获并抛出,并在Main中接收到并处理。在Test()中的throw下方的Console.WriteLine并未执行。那么我们可以得出如下结论:
结论1: throw中的异常被抛出后,该异常被外层调用处接收。 且t hrow 下方代码不被 执行
示例一
 
        其次,我们将示例一中的第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=====================");
            }
        }
    }
}

对技术感兴趣的小伙伴,可以给我留言或私聊我,我们可以互相讨论学习。

欢迎关注我个人的公众号

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值