LINUX.ORG.RU

маленький вопрос по обработке исключений


0

1

В двух словах опишу ситуацию: есть один метод, который выдает либо true либо ошибку. Мне же надо получить от него значение false. С точки зрения качества кода что будет правильнее: переписать метод чтобы он выдавал false вместо ошибки или сделать обработку exception'a? Чем-то задним понимаю, что строить логику на ошибках не очень правильно, но подтверждения своих мыслей с ходу найти не могу

★★★☆

Здесь уместно такое соображение: throw это почти то же самое что goto, а строить логику программы на goto уже 40 лет как не рекомендуется.

Обработку же фатальных ошибок (после которых выполнение программы/подпрограммы уже не имеет смысла) допустимо делать с использованием throw.

ringill ()

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

mashina ★★★★★ ()

У меня в коде есть именно такое место. Функция возвращает bool при нормальной работе, и кидает exception при ошибке.

Вопрос в том, желаешь ли ты вообще использовать исключения.

Если да, то вперед. Пусть кидается исключение всякий раз, когда в программе происходит ошибка, т.е. нарушается _нормальный_ ход программы. Тут тоже есть варианты. Например, невозможность открытия какого-то файла - это не всегда ошибка :)

Если нет, то есть разные способы. Например, помещать результат в структуру по указателю, а возвращать именно код ошибки. Или enum какой-либо.

Deleted ()

можно возвращать int (1,0 или ошибка - отрицательное число).

МОжно кидать эксшепн (производительность теряется, но зато самая прозрачная логика ИМНО)

Можно писать код ошибки в какую то глобальную переменную. (0 или ошибка).

Можно писать код ошибки какую то переменную передаваемую по ссылке в ф-ю.

Больше в голову ничего не приходит. Что лучше - сами выбирайте, от задачи зависит.

AIv ★★★★★ ()
Ответ на: комментарий от ringill

> Здесь уместно такое соображение: throw это почти то же самое что goto, а строить логику программы на goto уже 40 лет как не рекомендуется.

«Расположение строк должно восприниматься глазами, а их содержания умом» (c) Ч.Диккенс.

Месячник бреда на ЛОРе продолжается. Скока ж мифов и легенд бродит в головах программистов, впору книжку выпускать...

AIv ★★★★★ ()

ИМХО, уместен эксепшн.

gear ★★★ ()
Ответ на: комментарий от ringill

throw это почти то же самое что goto

А вызов функции это тоже почти то же самое, что и goto.

Begemoth ★★★★★ ()
Ответ на: комментарий от AIv

>МОжно кидать эксшепн (производительность теряется, но зато самая прозрачная логика ИМНО)

вот как раз вопрос производительности там не сильно важен, это конструкция вида wait.until()

vostrik ★★★☆ ()

Если ошибка не критическая и есть возможность переписать метод — то нужно переписывать.

xetf ★★ ()
Ответ на: комментарий от xetf

абсолютно не критическая, просто метод не возвращает false а возвращает вместо него timeout error

vostrik ★★★☆ ()

Исключение, это как не странно, исключительная ситуация. Если ваша ситуация исключительна, кидайте, если обычное дело - возвращайте false.

slovazap ★★★★★ ()
Ответ на: комментарий от ringill

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

JackyTreehorn ()

Нормальный, портируемый, оборачиваемый и вообще хороший вариант - возвращать false (а ещё точнее int 0\1), а получатель пусть сам решает как его обрабатывать.

jcd ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.