ошибка
Если метод не генерирует исключение, ошибка не возникает. Метод смог выполнить работу, которую обещал сделать, поэтому он уйдет с дороги и не будет пытаться вернуть какой-либо код состояния. Вам не нужно проверять код состояния, потому что вы будете знать, что он успешно выполнен.
Если метод не выполнит операцию копирования, будет сгенерировано исключение. В этом случае метод не смог выполнить работу, которую он обещал, что означает, что произошло нечто странное (исключительное), поэтому возникает исключение. Поскольку выдается исключение, вы вынуждены иметь дело с ним, или ваша программа взрывается. Так что нет смысла проверять код состояния. Вы не можете написать какой-либо код, который в любом случае мог бы прочитать этот код состояния, так как код проверки состояния никогда не будет достигнут. Поток кода будет идти к блоку 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
- синхронная операция. Поэтому, как только метод завершен, фактическое копирование завершено.
Это означает, что вы можете написать строку кода сразу после строки копирования. И этот код может ожидать, что файл будет там, чтобы он был полностью скопирован и чтобы он был доступен.