Предпочтительный способ проверки на ошибки - PullRequest
1 голос
/ 01 декабря 2010

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

int a; //example in C++, but translate into your language of choice...
cin >> a;
if(a < 0 || a > 5)
    cout << "You must enter in a number between 0 and 5 inclusive!" << endl;

Или с исключением в try-catchблок?

try
{
    int a;
    cin >> a;
    if(a < 0 || a > 5)
        throw "You must enter in a number between 0 and 5 inclusive!" << endl;
}
catch(string msg)
{
    cout << msg << endl;
}

Ответы [ 3 ]

2 голосов
/ 01 декабря 2010

Вопрос: 'Может ли функция решить, как обрабатывать неверный / недействительный / недопустимый ввод?' .Если это возможно, то не должно возникать никаких ошибок, в противном случае возникает ошибка.

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

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

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

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

2 голосов
/ 01 декабря 2010

Ни один не «лучше». Как поступить с аномальными условиями, ошибками и т. Д., Полностью зависит от конкретных обстоятельств и дизайна вашего кода. Блоки try-catch отлично подходят для случаев, когда из-за ошибки должен быть пропущен следующий код. С другой стороны, если вы хотите сообщить пользователю о проблеме, но в любом случае продолжить, допустим, приняв значение по умолчанию, тогда try-catch может не подойти.

Кроме того, некоторые программы разработаны с пользовательским кодом обработки ошибок, чтобы можно было регистрировать и записывать ошибки и аномалии, а также гарантировать, что программа может завершиться неудачей. Если вы работаете с такой системой, вы можете вообще не использовать 'throw', а вместо этого что-то вроде ErrorHandler.logError («Что-то пошло не так!»);

1 голос
/ 01 декабря 2010

Зависит от ваших целей и зависит от языка (вы указали это как независимый от языка.) В C ++ исключения довольно дороги, поэтому вы должны быть осторожны с их использованием. Мое правило таково: если ошибка видна пользователю, вы можете использовать исключение. Однако многие люди не согласятся. По сути, существует множество различных школ мысли.

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

В приведенном вами конкретном примере это зависит от того, что может вызвать ошибку. Если это ошибка проверки пользователя (как кажется), тогда будет целесообразно исключение. Если это нормальная часть потока программы, то коды возврата будут более подходящими.

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