错误
如果该方法没有抛出异常,则没有发生错误。该方法能够执行它所承诺的工作,因此它会避开,并且不会尝试返回某种状态代码。您无需检查状态代码,因为您会知道它已成功。
如果该方法复制操作失败,则会抛出异常。在这种情况下,该方法无法执行它所承诺的工作,这意味着发生了一些奇怪的(异常)事情,因此引发了异常。由于抛出了异常,你不得不处理它,或者你的程序崩溃了。所以检查状态码是没有意义的。无论如何,您无法编写任何能够读取该状态代码的代码,因为永远无法到达状态检查代码。代码流将进入catch
块,或程序终止。
这些概念是使用异常处理错误的基础。
如何处理异常
除非您需要,并且有一些合理的方法可以从异常中恢复,否则不要处理它们。让你的程序爆炸。这将使在野外发现代码中的错误变得更加容易,因为未处理的异常会产生堆栈跟踪,它将准确地告诉您程序的哪个部分发生了故障,以及代码是如何到达那个点的。
如果您有合理的恢复方式(例如,简单地向用户显示错误消息并重试操作,或者让他们输入不同的参数),那么您可以编写一个try
/catch
块。编写可能在块中引发异常的代码,try
并在块中编写恢复代码catch
。
try
{
var file = File.Open(filename);
// Todo: Work with open file here
}
catch(FileNotFoundException e)
{
MessageBox.Show("Failed to open file - " + e.ToString());
// Todo: Additional recovery here,
// like telling the calling code to re-open the file selection dialog
}
请注意,您永远不应该捕获基本Exception
类型,而应该捕获您可以处理的特定派生异常类型(例如FileNotFoundException
)。这是有道理的,因为您可能无法编写能够从 中成功恢复的代码OutOfMemoryException
,并且该异常可能会在您的代码中的任何位置抛出。如果你 catch Exception
,那么你正在编写试图处理任何事情的代码,而不仅仅是你感兴趣的异常。
完成
File.Copy
是同步操作。因此,一旦方法完成,实际的复制就完成了。
这意味着您可以在复制行之后立即编写一行代码。并且该代码可以期望文件在那里,可以完全复制它,并且可以访问它。