throw,throw ex 与 ExceptionDispatchInfo.Throw(ex)

发布时间 2023-05-31 16:51:14作者: 顾小凡

有以下代码

using System.Diagnostics;
using System.Runtime.ExceptionServices;

using Microsoft.AspNetCore.Mvc;

using static System.Net.Mime.MediaTypeNames;

namespace WebSignalR.Controllers
{
    [ApiController]
    [Route("[controller]")]
    public class WeatherForecastController : ControllerBase
    {
       
        public WeatherForecastController()
        {
        }

        [HttpGet]
        public async Task Get()
        {
            try
            {
                //Test();
                Test2();
               // Test3();
            }
            catch (Exception ex )
            {

                throw;
            }
         

            await Task.Delay(1);
        }

        public void Test()
        {
            try
            {
                var res = Convert.ToInt32("1qq");
            }
            catch (Exception ex)
            {
                throw;
            }
           
        }

        public void Test2()
        {
            try
            {
                var res = Convert.ToInt32("1qq");
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        public void Test3()
        {
            try
            {
                var res = Convert.ToInt32("1qq");
            }
            catch (Exception ex)
            {
                ExceptionDispatchInfo.Throw(ex);
            }
        }

    }
}

当运行 Test 方法时,两次异常捕获的详情如下:

 

 由图可知如果使用 throw 抛出异常,则可以保留原始异常的堆栈跟踪信息

 

当运行 Test2 方法时,两次异常捕获的详情如下:

 

 使用 throw ex 抛出异常时会重置异常的堆栈跟踪信息,导致该异常只包含当前的调用栈信息,丢失了原始异常发生位置的信息