@beduin01

Что должна возвращать функция в catch блоке?

Предположим есть функция `string foo() { }` которая возвращает какие-то данные. но функция может упасть. Поэтому внутри нее есть try-catch блок. Вопрос. Что более правильно делать в catch блоке? Ведь компилер не даст собрать функцию т.к. у в блоке catch должен быть тоже какой-то возврат.

Как правильнее быть?
  • Вопрос задан
  • 646 просмотров
Решения вопроса 1
lam0x86
@lam0x86
Если метод может упасть, при этом не понятно, что он должен в этом случае вернуть, правильнее не ловить исключение вообще. Обрабатывать исключение надо на том уровне, где ясно, как с ним поступить.
Более продвинутый вариант - ловить исключение, логгировать ошибку, и пробрасывать его дальше в сыром виде (throw;) или в обёртке из business-specific исключения:
try
{
  return int.Parse(stringValue);
}
catch (FormatException ex)
{
  Logger.Error(ex);
  throw new MyParserException($"Неверный формат числа {stringValue}", ex);
}
catch (OverflowException ex)
{
  Logger.Error(ex);
  throw new MyParserException($"Выход за допустимый диапазон {stringValue}", ex);
}
.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
tomnolane
@tomnolane
профессиональный разработчик
1) не обязательно в catch делать то, что функция должна возвращать:
public static object Points(int a, int b)
        {
            int result  = 0;
            try
            {
                //делаю что-то и падаю
                return result;
            }
            catch(Exception ex)
            {
                Console.WriteLine(ex.StackTrace); //выведи мне в Console описание ошибки
            } 
            return result;
        }

2) есть такая шутка, которая называется finally
int result  = 0;
            try
            {
                throw new Exception(); 
                return result;
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.StackTrace);
            }
            finally
            {
                result = -1;
            }


которая выполниться в любом случае (в т.ч. и когда функция падает)

Что должна возвращать функция в catch блоке?

1) Информацию об ошибке
catch (Exception ex)
            {
                Console.WriteLine(ex.StackTrace);
            }

2) либо присвоить значения выходного объекта (в вашем случае это string ..судя по примеру)
catch 
            {
                string result = "Ошибка";
            }

3)можно и то и другое
4) можно ничего не делать в catch (называется "заглушка")
catch {}
и после него return то, что нужно ретюрнуть
Ответ написан
Комментировать
alexsandr0000
@alexsandr0000
Программист C#/C++/C
В блоке Try вы помещаете потенциально небезопасный код. В блоке Catch вы обрабатываете нештатную ситуацию, но при этом необходимо понимать, что в стек может быть поврежден. Обычно в данном блоке фиксируется нештатная ситуация или исключение передается вышестоящей функции оператором throw. В блоке finality происходит очистка ресурсов, вызов finality осуществляется уже сборщиком мусора в неизвестный момент времени.
При этом возможны вариации try-catch или try-finality
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы