Каков рекомендуемый способ отловить исключения? - PullRequest
1 голос
/ 30 октября 2019

Я должен сделать обзор кода и попал в часть кода, в которой рассматриваются возможные исключения. мне кажется, что разработчик работает, но я хочу спросить, как это обычно и правильно сделать. Как лучше всего ловить исключения? кодер написал:

  try 
  { . . . }
  catch (Exception ex)
  {
    if (ex is PlatformNotSupportedException)
    { //for the Windows version or edition that does not support.
    // tracing
    }
    else if (ex is NotSupportedException || ex is IOException)
    { // for the NTFS not supported or EFS is not configured
      // tracing
    }
    else
    {
      //report any exception as encrypt/decrypt
    }
  }

Я думал, что Книга говорит, что это должно быть:

  catch (PlatformNotSupportedException pnse)
  {
    //for the Windows version or edition that does not support.
    // tracing
  }
  catch (NotSupportedException nse)
  {
    // for the NTFS not supported or EFS is not configured
    // tracing
  }
  catch (IOException ioe)
  {
    // tracing for IOE
  }   
  catch (Exception e)
  {
      //report any exception as encrypt/decrypt
  }

Ответы [ 3 ]

6 голосов
/ 30 октября 2019

Второй подход был бы более предпочтительным. Однако есть небольшая разница между предлагаемым решением и текущим. Вам необходимо выполнить рефакторинг в метод или скопировать код в двух местах (NotSupportedException и IOException блоки захвата), в то время как текущая реализация обрабатывает его в одном и том же блоке if.

Итак,если вы хотите следовать тому же подходу, вы можете использовать when ключевое слово , чтобы отфильтровать определенные типы и многое другое.

  catch (PlatformNotSupportedException pnse)
  {
    // for the Windows version or edition that does not support.
    // tracing
  }
  catch (Exception ex) when (ex is NotSupportedException || ex is IOException)
  {
    // for the NTFS not supported or EFS is not configured
    // tracing
  } 
  catch (Exception e)
  {
      //report any exception as encrypt/decrypt
  }

Если это не обязательно, вы можете оставить реализацию как есть.

2 голосов
/ 30 октября 2019

TLDR: Используйте вторую форму, чтобы компилятор улавливал ошибки упорядочения.

Причина, по которой вам следует использовать вторую форму, состоит в том, что тогда вы получите ошибку компиляции, если попытаетесьдля обработки типов в неправильном порядке.

Например, это приведет к фактической ошибке компиляции:

try
{
    throw new ArgumentOutOfRangeException();
}

catch (Exception)
{
    Console.WriteLine("Caught 'Exception'");
}

// This gives a compile error:
// "Error CS0160  A previous catch clause already catches all exceptions of this or of a super type ('Exception')"

catch (SystemException)
{
    Console.WriteLine("Caught 'SystemException'");
}

Однако использование if/else if НЕ приведет к ошибке компиляции, поэтомуошибка остается незамеченной:

try
{
    throw new ArgumentOutOfRangeException();
}

catch (Exception ex)
{
    if (ex is Exception)
    {
        Console.WriteLine("Caught 'Exception'");
    }
    else if (ex is SystemException) // This will never be reached, but no compile error.
    {
        Console.WriteLine("Caught 'SystemException'");
    }
}

Обратите внимание, однако, что такие инструменты, как Resharper, будут предупреждать вас о втором случае.

0 голосов
/ 30 октября 2019

это будет общим для всех типов исключений

try 
{
   .....code
}
catch (Exception ex)
{
    MessageBox.Show(ex.Message);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...