ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 11.12.2025
Просмотров: 3166
Скачиваний: 1
любые возвращаемые значения корректны. Не всегда везет поработать с функцией, которая должна возвращать только положительные значения. Например, вы не можете получить логарифм отрицательного числа, но само значение логарифма может быть как положительным, так и отрицательным.
Вы можете предложить справиться с этой проблемой, возвращая код ошибки как значение функции, а необходимые данные — посредством ар гумента, описанного как out, но такое решение менее интуитивно и теря ет выразительную силу функции. Сперва познакомьтесь с исключениями, и вы убедитесь, что они предоставляют гораздо более красивый путь ре шения проблемы.
В целом числе не удается разместить большое количество информации. Так, рассматриваемая функция Factorial О возвращает -1, если ее аргумент от рицателен. Локализовать ошибку было бы проще, если бы был известен сам аргумент, но в возвращаемом функцией типе для него просто нет места.
Обработка ошибок является необязательной. Вы не получите никаких пре имуществ от проверок в функции Factorial ( ) , если вызывающая функ ция не будет в свою очередь проверять возвращаемое значение. Конечно, руководитель группы может просто сказать: "Парни, или вы проверяете ко ды ошибок, или занимаете очередь на бирже труда", но совсем иное дело, когда проверку заставляет выполнить сам язык программирования.
Зачастую при проверке кода ошибки, возвращаемого функцией Factorial () или лю бой другой функцией, практически вся вызывающая функция оказывается заполненной проверками всех возможных кодов ошибок от всех вызванных функций, при этом просто не остается ни сил, ни места сделать в функции хоть что-то полезное. Судите сами:
//Вызов SomeFuncO, проверка кода ошибки, его обработка и
//возврат из функции
errRtn = SomeFunc () ;
if (errRtn == SF_ERRORl)
(
Console .WriteLine ("Ошибка типа 1 при вызове SomeFuncO"); return MY ERROR 1;
if (errRtn == SF ERROR2)
Console .WriteLine ("Ошибка типа 2 при вызове SomeFuncO"); return My_ERROR 2;
}
// Вызов другой функции, проверка кода ошибки и так далее..
.errRtn = SomeOtherFuncО; if (errRtn == SOF_ERRORl)
{
Console.WriteLine("Ошибка типа 1 при вызове " + "SomeOtherFunc () ") ;
return MY ERROR 3;
)
if (errRtn == SOF ERROR2)
{
Console.WriteLine("Ошибка типа 2 при вызове " +
Глава 18. Эти исключительные исключения |
399 |
}
finally
{
//Выполнение всех завершающих действий: закрытие
//файлов, освобождение ресурсов и т.п. Этот блок
//выполняется независимо от того, было ли
//сгенерировано исключение.
}
}
public |
void |
SomeOtherFunction() |
|
|
|||
{ |
|
|
|
|
|
|
|
I I |
. . . |
Ошибка произошла |
где-то в теле |
функции . . . |
|||
11 |
. . . Ж "пузырек" исключения "всплывает" вверх по |
||||||
// |
всей |
цепочке вызовов, |
пока |
не будет |
перехвачен в |
||
// |
блоке |
|
catch |
|
|
|
|
throw |
new |
Exception("Описание |
ошибки"); |
||||
I I |
. . . |
Продолжение функции . . . |
|
||||
Функция Some Function () помещает некоторую часть кода в блок, помеченный ключевым словом try. Любая функция, вызываемая в этом блоке (или функция, вызы ваемая функцией, вызываемой в этом блоке — и так далее...), рассматривается как вы званная в данном try-блоке.
Непосредственно за блоком try следует ключевое слово catch с блоком, которому передается управление в случае, если где-то в try-блоке произошла ошибка. Аргумент catch-блока — объект класса Exception (или некоторого подкласса Exception).
Однако catch-блок не обязан иметь аргументы: пустой catch перехватывает все
исключения, как и catch(Exception): catch
Если вам не нужен доступ к информации из объекта перехваченного исключения, вы можете указать в блоке только тип исключения:
catch (MyException)
{
// Действия, которые не требуют обращения к объекту // исключения
}
Блок finally— если таковой имеется в вашем исходном тексте — выполняется даже в случае перехвата исключения, не говоря уже о том, что он выполняется при нор мальной работе. Обычно он предназначается для "уборки" — закрытия открытых фай лов, освобождения ресурсов и т.п.
В отличие от исключений С++, в которых аргументом catch может быть объ ект произвольного типа, исключения С# требуют, чтобы он был объектом клас са Exception или производного от него.
Итак, где-то в дебрях кода на неизвестно каком уровне вызовов в функции SomeO-
t h e r F u n c t i o n ( ) |
случилась ошибка... Функция сообщает об этом, генерируя исклю- |
|
Глава 18. Эти |
исключительные исключения |
401 |