пытаясь обернуть голову вокруг исключений и когда их использовать - PullRequest
0 голосов
/ 05 февраля 2019

Я не новичок в кодировании, я занимался этим долгое время, на работе я использовал Java, поэтому я просто использовал блок try-catch, когда компилятор сказал мне об этом.В C # потому что исключения могут пузыриться, компилятор не заставляет вас использовать его.Я знаю, что должен использовать блоки try-catch, когда смогу восстановиться после исключения, но это, честно говоря, мне мало помогает, потому что я никогда не чувствую необходимости их использовать.С базой данных я просто использую оператор using, и если код находится в веб-интерфейсе Api и происходит сбой, потому что он не может соединиться с базой данных, он автоматически возвращает 500 внутреннюю ошибку сервера, поэтому на самом деле мне ничего не нужно с ней делать.

Я много читал об этой теме, но на самом деле не могу вспомнить, когда мне следует использовать блок try-catch вместо использования или выполнения ничего, и я знаю, что это, вероятно, мешает мне улучшить.

Ответы [ 4 ]

0 голосов
/ 05 февраля 2019

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

В вашем случае среда перехватывает все исключения и возвращает внутреннюю ошибку сервера.Это общая обработка исключений.Это нормально, поэтому служба не останавливается неожиданно.Но я думаю, что вам нужно что-то узнать об ошибке и сохранить ее в файле журнала или сообщить пользователю более конкретно, какая ошибка возникает.Это когда вы должны использовать обработку исключений.

0 голосов
/ 05 февраля 2019

Лично я принял try / catch в любом нетривиальном коде, который я пишу.Если я хочу обработать определенное исключение, я добавляю блок catch для этого, если у меня нет стандартного блока, который я использую, чтобы передать информацию, которую я нашел бы полезной.

В общих чертах, хотя, естьэто тонна информации по этому вопросу в Интернете.Я рекомендую немного почитать и решить, какой подход вам больше подходит.

0 голосов
/ 05 февраля 2019

Использование блока не позволяет вам восстановиться после вашего исключения, оно просто обеспечивает удаление ресурсов в случае неперехваченного исключения.Для вас очень важно понимать обработку исключений в вашем приложении.Вам не нужно перехватывать каждое исключение, но вы должны по крайней мере перехватывать исключения в точке входа вашего приложения, чтобы предотвратить сбои.

Давайте использовать пример, так как это помогает мне лучше понять концепции.

Представьте, что мы создаем приложение WPF, и когда пользователь нажимает кнопку, отправляется вызов базы данных и возвращаются некоторые ресурсы.Если по какой-либо причине ваша база данных была отключена от сети и вы не вызывали ее в попытке / перехвате, но вызывали ее в блоке using, приложение зависало и создавало плохое впечатление для ваших пользователей или не помогало вам с отчетами об устранении неполадок.Если мы введем попытку / перехват в нашем вызове базы данных, мы можем более изящно сообщить пользователю об ошибке и обработать проблемы с нашей базой данных.

try 
{
     //Some db access has failed
}
catch(DbOfflineException ex)
{ 
    // Show message box to user 
    // Notify IS DB Team about critical issue
    // Rethrow if our calling method also has a try catch
}
catch(Exception ex)
{
    // If the exception isn't of type DbOfflineException we
    // would get to this catch block and could handle differently
}

Вы также можете объединить в цепочку различные типы исключений, если вы хотите конкретную обработку дляDbOfflineExceptions или Generic Exceptions, которые продемонстрированы выше.

Проверьте эту статью для получения дополнительной информации: https://docs.microsoft.com/en-us/dotnet/standard/exceptions/

0 голосов
/ 05 февраля 2019

Этот ответ не является всеобъемлющим.Я просто попытаюсь показать несколько примеров.

Ведение журнала

Использование исключений может быть очень полезно для регистрации ошибок.Возможно, вы даже захотите повторно сгенерировать исключение, когда закончите регистрацию.Знание того, какие исключения генерируются, когда они генерируются, как часто и т. Д., Может быть очень полезным для отладки или улучшения базы кода.

Пример:

try
{
  DoThingThatFails();
}
catch (ExpectedException ex)
{
  LogException(ex, DateTime.Now);

  //rethrow the exception
  throw;
}

Создание библиотеки

Это может быть внутренняя или публичная библиотека.Исключения являются отличным способом обработки некорректных или неподдерживаемых операций.Скажем, у вас есть класс, который должен взять строку.Для этого абсолютно необходимо, чтобы ему была передана правильная ненулевая строка.Если пользователь библиотеки (может быть вы или кто-то еще) передает недопустимое значение, например null, вы можете выдать исключение.

Пример:

class Example
{
  //name must be a valid, non-empty string
  public Example(string name)
  {
    if (String.IsNullOrEmpty(name))
      throw new InvalidOperationException("The name parameter was null or empty");

    //Initialize your new object
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...