我不太精通C#,但我有时会涉足其中。我不确定将using
语句与异常处理结合在一起的最佳方法。我使用的是Mono编译器,因此无法使用C#8.0 using var s = ...
语句。
对我来说,似乎有两个选择,最建议的是将using
块包装在try / catch块中。
using
块包装在try / catch块中try {
using (Stream s = File.Open("foo.bar", FileMode.Open)) {
//
}
} catch (FileNotFoundException ex) {
//
}
我对此方法的反对主要是我无法在using语句本身(即文件的打开)中专门捕获由该语句引发的异常。 catch
块捕获在using块内的代码中引发的任何异常,即使这可能不是故意的。]
using
语句本身中初始化对象Stream s;
try {
s = File.Open("foo.bar", FileMode.Open);
} catch (FileNotFoundException ex) {
//
}
using (s) {
//
}
对我来说,这似乎是一个更好的解决方案,但是Microsoft文档网站建议不要这样做:https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/using-statement
您可以实例化资源对象,然后将变量传递给using语句,但这不是最佳实践。在这种情况下,控制权离开using块后,对象将保留在范围内,但可能无法访问其非托管资源。换句话说,它还没有完全初始化。如果尝试在using块之外使用该对象,则有引发异常的风险。因此,最好在using语句中实例化该对象并将其范围限制为using块。
行业在这种情况下推荐的方法是什么?
我不太精通C#,但我有时会涉足其中。我不确定将using语句与异常处理结合在一起的最佳方法。我正在使用单声道编译器,所以我...
第一种方法显然更好。您为什么不想从使用body捕获异常?在我看来,使用语句主体没有FileNotFoundException
。第二种方法确实很难阅读和理解