有以下代码
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
抛出异常时会重置异常的堆栈跟踪信息,导致该异常只包含当前的调用栈信息,丢失了原始异常发生位置的信息