结合使用C#语句和异常处理的最佳方法

问题描述 投票:0回答:1

我不太精通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语句与异常处理结合在一起的最佳方法。我正在使用单声道编译器,所以我...

c# exception mono using-statement
1个回答
0
投票

第一种方法显然更好。您为什么不想从使用body捕获异常?在我看来,使用语句主体没有FileNotFoundException。第二种方法确实很难阅读和理解

© www.soinside.com 2019 - 2024. All rights reserved.