异常处理问题

时间:2009-07-28 18:35:17

标签: c# .net vb.net io

我有以下代码:

            try {
                fi.MoveTo(getHistoryFileName());
            } finally {
                Debug.Write("Move complete");
            }

我认为使用它会确保我永远不会抛出异常,但有时我会得到IOExceptions。是什么原因?

8 个答案:

答案 0 :(得分:7)

终于不会捕获抛出的异常;它保证无论try块中是否抛出异常,它中的代码都会执行。

您将要捕获异常,然后适当地处理它们。 Catch块将位于Try和Finally块之间,并从以下内容开始:

catch(Exception ex)
{
     //error handling
}

您可以使用更具体的异常替换Exception,以便只处理该异常。

答案 1 :(得分:4)

try / finally组合不会像您认为的那样处理异常。

它所做的一切尽可能确保finally块中的代码将运行,即使在try块中的代码中抛出异常的情况下也是如此。

要避免特定的例外情况,请按照以下方式处理:

try {
    fi.MoveTo(getHistoryFileName());
} catch (IOException ex) {
    // swallow this one
} finally {
    Debug.Write("Move complete");
}

答案 2 :(得分:3)

这意味着finally块将始终执行,即使例外。

catch (IOException)之前,您仍然需要一个finally块来处理您不想传播的异常。

try {
    fi.MoveTo(getHistoryFileName());
} catch (Exception) {
  // eat exceptions.
} finally {
    Debug.Write("Move complete");
}

答案 3 :(得分:2)

您没有catch子句,因此没有异常被捕获。

finally子句不会吞下异常,只是在异常被抛出到调用函数之前执行。

那个和吞咽异常是一个坏主意。你不应该吞下异常,而应该适当而优雅地处理它们。至少它们应该被记录以进行调试。

答案 4 :(得分:2)

正如其他人所说,如果你想阻止未处理的异常冒泡,你需要一个catch块。但我对你的问题感到困扰。你这样说:

  

永远不会抛出异常

这是巧妙的错误。你永远不能停止抛出异常。你所能做的就是处理它,这样它就无法用于用户。我甚至可以放手,因为很难用语言来表达这一点。但是你的finally块中也有“Move complete”行。把它们放在一起,这让我想知道你是否认为只要通过捕获异常就可以强制你的try块代码成功。这很危险。不要只是吞下异常,然后向用户报告一切都按预期进行。

答案 5 :(得分:1)

重写:

try {
  fi.MoveTo(getHistoryFileName());
} catch (Exception ex) {
  // do something about it.
} finally { 
Debug.Write("Move complete");
}

答案 6 :(得分:1)

您使用catch来捕获任何异常。最后只是确保即使抛出异常,它的内容也会执行。 (即使出现问题也很好清理。)

答案 7 :(得分:1)

你的捕获在哪里?

try {
 fi.MoveTo(getHistoryFileName());
}
catch (IOException ex) {
//log it  and take apporpriate action
} finally {
Debug.Write("Move complete");
}