我知道这个问题已经被问过很多次了,但我仍然不明白正确的顺序应该是什么。

如果要在对象创建中捕获异常,则必须将 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/

10-15 06:29