我正在尝试捕获异步方法中抛出的自定义异常,但由于某种原因,它总是被通用异常catch块捕获.请参阅下面的示例代码
class Program { static void Main(string[] args) { try { var t = Task.Run(TestAsync); t.Wait(); } catch(CustomException) { throw; } catch (Exception) { //handle exception here } } static async Task TestAsync() { throw new CustomException("custom error message"); } } class CustomException : Exception { public CustomException() { } public CustomException(string message) : base(message) { } public CustomException(string message,Exception innerException) : base(message,innerException) { } protected CustomException(SerializationInfo info,StreamingContext context) : base(info,context) { } }
解决方法
问题是Wait抛出了一个AggregateException,而不是你想要捕获的异常.
你可以用这个:
try { var t = Task.Run(TestAsync); t.Wait(); } catch (AggregateException ex) when (ex.InnerException is CustomException) { throw; } catch (Exception) { //handle exception here }