最近在using语句中遇到异常处理的问题。问题是在“使用 block ”中抛出的异常可能会被吞噬,例如查看代码:
class DisposableObject : IDisposable
{
public void Dispose()
{
throw new Exception("dispose");
}
}
class Program
{
static void Main()
{
try
{
using (var obj = new DisposableObject())
{
throw new Exception("using");
}
}
catch(Exception ex)
{
Console.WriteLine(ex.Message);
}
}
}
在此示例中,您将在输出中看到“dispose”,第一个异常将被忽略,您永远不会知道它。经过一番搜索,我找到了文章 https://msdn.microsoft.com/en-us/library/aa355056(v=vs.110).aspx关于使用 block 的常见错误。但我的问题不是关于如何避免异常吞噬,我想知道为什么 MS 决定使用 block 来解包
try
{
...
}
finally
{
}
而不是其他方式,例如他们可以使用这样的方式解包:
//this code prevents exception swallowing
try
{
...
}
catch (Exception ex)
{
try
{
if (obj != null)
obj.Dispose();
}
catch (Exception disposeEx)
{
throw new AggregateException(ex, disposeEx);
}
throw;
}
if(obj != null)
obj.Dispose();
最佳答案
因为 AggregateException
在创建 using()
block 时不存在。
也因为 Dispose()
真的不应该抛出。
最后,因为您的示例和 finally
block 之间在异常过滤器、堆栈展开和关键区域方面存在细微的语义差异。
关于c# - 为什么使用 block 会吞下异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31014009/