我有以下代码:
try {
fi.MoveTo(getHistoryFileName());
} finally {
Debug.Write("Move complete");
}
我认为使用它会确保我永远不会抛出异常,但有时我会得到IOExceptions。是什么原因?
答案 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");
}