Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
int f1(int k){
if(k==0){
try{ File.Delete("tmp.tmp"); }catch{}
}
return 2*k;
}
int f2(int k){
if(k==0) File.Delete("tmp.tmp");
return 2*k;
}
Не всегда и не везде:
today.java.net/article/2006/04/04/exception-handling-antipatterns#antipatterns
stackoverflow.com/questions/2870701/risking-the-exception-anti-pattern-with-some-modifications
www.rockstarprogrammer.org/post/2007/jun/09/java-exception-antipatterns/
etc
Foo() :
data( 0 )
{
// ... развлекаемся
struct Foo
{
boost::scoped_array<char> data;
Foo()
{
File file("somefile");
data.reset(new char[file.length()]);
file.read(data.get(), file.length());
}
};
Socket s;
if(s.is_valid())...
Исключения просто менее эффективны: либо требуют много дополнительной памяти на таблицы с identity, либо дополнительных записей в память, при чём при каждом вызове функции, что создаёт существенные накладные расходы.
И вообще, исключения — это вообще-то очень древний и корявый способ. Человечество как бы уже додумалось до сопроцедур (coroutines), до продолжений (continuations) и прочих механизмов, которые дают понятную логику с возвратом значений, на далёкий уровень стека вызовов: основное важное качество исключений
не говоря уже о дополнительных расходах при вызове функций — членов класса.виртуальных функций.
Да ну. В большой и сложной системе исключения, повторюсь, это — вынос мозга.Мягко говоря, спорное утверждение. Уж не знаю про какой язык речь, но в большинстве известных мне всё как раз наоборот, имхо. Если про ООП говорить, то тем более. Исключения как раз гораздо более подходят для полноценной абстракции, чем коды возврата. Например, в java это и просто не принято и неудобно совершенно. Возврат null в некоторых случаях допустим, например, когда отсутствие объекта само по себе не ошибка ну и т. д., от реализации зависит.
я не знаю что-то кое CreateEvent, но если он падает только в конкретном модуле, потому что он как-то не так его вызывает, то пусть и дохнет этот самый модуль, а не всё приложение целиком.
Если я вызываю функцию, то неужели я должен знать все возможные исключения, которые эта функция может выбросить, включая все те исключения, которые бросают вложенные функции и библиотеки, которыми пользуется данная реализация функции, а как насчет того, что реализация может изменится?
То есть исключения не могут входить в интерфейс функции?
Если не заботиться о обработке исключений при непосредственном вызове функций, то вероятно нужно обрабатывать их на каких-то определенных слоях системы, но тут возникает тот-же вопрос: «Как гарантировать то, что все исключения были обработаны»? Как насчет новых типов исключений?
Если кто-то добавляет новое исключение в низкоуровневую функцию, то как это исключение нужно обработать? А что если эта функция используется в нескольких проектах?
Как программировать и сопровождать код с исключениями?
А еще как убедить программистов не прятать свои же ошибки с использованием конструкции catch(...)?
Коды возврата vs исключения — битва за контроль ошибок