我知道这个问题已经被问过很多次了,但我仍然不明白正确的顺序应该是什么。
如果要在对象创建中捕获异常,则必须将 try 和 catch 放在 using 语句之外:
try { using... } catch (Exception e) { }
如果您想在创建对象后捕获异常,则:
using(...) { try {...} catch (Exception e) {} }
但是,如果您想在对象创建期间和之后都进行捕获怎么办?可不可能是:
try { using(...) { try {...} catch (Exception e) {} } } catch (Exception e) { }
还是只使用 try、catch 和 finally 和 dispose 会更好?
最佳答案
using block 更多的是关于处置而不是创造。如文档中所述,这是此代码的快捷方式:
{
Font font1 = new Font("Arial", 10.0f);
try
{
byte charset = font1.GdiCharSet;
}
finally
{
if (font1 != null)
((IDisposable)font1).Dispose();
}
}
这是 try-catch block 的定义
因此,从那里开始,策略取决于您。这段代码:
try
{
using(Font font1 = new Font("Arial", 10.0f))
{
byte charset = font1.GdiCharSet;
}
}
将被翻译为:
try
{
Font font1 = new Font("Arial", 10.0f);
try
{
byte charset = font1.GdiCharSet;
}
finally
{
if (font1 != null)
((IDisposable)font1).Dispose();
}
}
如您所见,您正在捕获由构造函数、块和
Dispose
引起的异常。而这:
using(Font font1 = new Font("Arial", 10.0f))
{
try
{
byte charset = font1.GdiCharSet;
}
}
将被翻译为:
Font font1 = new Font("Arial", 10.0f);
try
{
try //This is your try
{
byte charset = font1.GdiCharSet;
}
}
finally
{
if (font1 != null)
((IDisposable)font1).Dispose();
}
因此,在这里您将捕获由构造函数或 Dispose 引起的异常。
关于C# - Try/Catch/Finally 并使用正确的顺序,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/52008272/