哪一个:
using (var myObject = new MyClass())
{
try
{
// something here...
}
catch(Exception ex)
{
// Handle exception
}
}
OR
try
{
using (var myObject = new MyClass())
{
// something here...
}
}
catch(Exception ex)
{
// Handle exception
}
如果你的catch语句需要访问using语句中声明的变量,那么inside是你唯一的选择。
如果catch语句在释放之前需要using中引用的对象,那么inside是唯一的选择。
如果您的catch语句执行一个持续时间未知的操作,例如向用户显示一条消息,并且您希望在此发生之前处理您的资源,那么外部是您的最佳选择。
每当我遇到类似于此的场景时,try-catch块通常位于调用堆栈中使用的另一个方法中。对于一个方法来说,知道如何处理像这样发生的异常是不典型的。
所以我的一般建议是在外面,在外面。
private void saveButton_Click(object sender, EventArgs args)
{
try
{
SaveFile(myFile); // The using statement will appear somewhere in here.
}
catch (IOException ex)
{
MessageBox.Show(ex.Message);
}
}
从c# 8.0开始,您可以在某些条件下简化使用语句来摆脱嵌套块,然后它只适用于封闭块。
所以你的两个例子可以简化为:
using var myObject = new MyClass();
try
{
// something here...
}
catch(Exception ex)
{
// Handle exception
}
And:
try
{
using var myObject = new MyClass();
// something here...
}
catch(Exception ex)
{
// Handle exception
}
这两点都很清楚;然后,这将两者之间的选择减少到您希望对象的作用域是什么,您希望在哪里处理实例化错误,以及您希望在什么时候处理它。