Существуют определенные сценарии, когда я просто хочу вызвать определенный метод для выполнения некоторой работы и не забочусь о том, чтобы обрабатывать все определенные исключения, которые он может использовать. Вместо этого мне все равно, если метод сработал или нет.
Я приведу пример .NET/С#. Скажем, у меня есть файл, который я хочу скопировать, и все, что мне действительно волнует, - успешная операция копирования или нет. Если копирование завершилось неудачно, мне все равно, если конкретное исключение было FileNotFoundException или исключение исключения IOException "Недостаточно места на диске" или что-то еще... Мое приложение будет нормально двигаться в этом случае, поскольку эта операция не критична.
Итак, идея, как реализовать это:
try
{
// try
System.IO.File.Copy(strFile, strFile + ".new");
}
catch (Exception ex)
{
// if critical exception then rethrow
if (IsCritical(ex))
throw;
// else just log and swallow...
Console.WriteLine("Failed to copy the file: " + ex.Message);
}
где IsCritical (Exception ex) - вспомогательный метод, определяемый как:
public static bool IsCritical(Exception ex)
{
if (ex is OutOfMemoryException) return true;
if (ex is AppDomainUnloadedException) return true;
if (ex is BadImageFormatException) return true;
if (ex is CannotUnloadAppDomainException) return true;
if (ex is ExecutionEngineException) return true;
if (ex is InvalidProgramException) return true;
if (ex is System.Threading.ThreadAbortException)
return true;
return false;
}
Этот вопрос основан на следующей статье: Обработка исключений в С# с учетом правила "Не выгружайте исключения, которые не могут обрабатывать"
Идея состоит в том, чтобы следовать основным правилам оптимальной практики обработки исключений: - не поймать общее исключение без реорганизации - поймайте только исключения, которые вы знаете, как обращаться - (в этом случае я хочу обрабатывать их все одинаково... путем ведения журнала и перехода с помощью логики приложения).
Итак, это хороший подход для данного сценария? Если нет, то почему и что лучше делать?