错误
如果方法没有抛出异常,那么就没有错误发生。该方法能够执行它承诺要做的工作,因此它会离开并不会尝试返回某种状态码。你不需要检查状态码,因为你会知道它已经成功了。
如果方法失败了副本操作,则会抛出异常。在这种情况下,该方法无法执行其承诺要做的工作,这意味着发生了一些奇怪(异常)的事情,因此会抛出异常。由于抛出了异常,你必须处理它,否则你的程序会崩溃。所以检查状态码是没有意义的。你无法编写任何代码来读取那个状态码,因为状态检查代码永远不会被执行到。代码流将进入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
的代码,并且该异常可能会在您的代码的任何地方被抛出。如果您捕获Exception
,那么您正在编写试图处理任何异常的代码,而不仅仅是您感兴趣的异常。
完成
File.Copy
是同步操作。因此,一旦方法完成,实际的复制就已经完成了。
这意味着您可以在复制行后立即编写一行代码。该代码可以期望文件存在,完全复制并且可以访问。