Что лучше / быстрее?Попробуй поймать или избежать исключения? - PullRequest
12 голосов
/ 07 января 2011

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

Избежать исключения может быть:

string a = null;
list = someMethod();
if(list.Length > 0 ){
   a = list[0];
}
if(a!=null) ...

Или попробуйте перехватить исключение ...

string a = null;
try{
    a = someMethod()[0];
catch{}
if(a!=null) ...

Ответы [ 8 ]

19 голосов
/ 07 января 2011

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

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

«Правильный» способ справиться с этой ситуацией:

var list = someMethod();
if(list == null || list.Length == 0) {
    // handle something bad
}
string a = list[0];
if(a != null) {
    // go
}

Вы можете избежать проверки того, что list не является нулевым и не пустым, еслисуществует контракт (Contract.Ensures), который гарантирует, что возвращаемое значение из someMethod не является нулевым и не пустым.

Правда, однако, исключения являются локально дорогими.Будут ли они влиять на производительность вашей программы (т.е. являются узким местом) - это совсем другой вопрос.Но при правильном использовании исключения, как правило, не являются узким местом (кто заботится о производительности в случае сбоя приложения?)

8 голосов
/ 07 января 2011

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

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

3 голосов
/ 07 января 2011

конечно, избегайте исключений, попытка catch приводит к снижению производительности.

2 голосов
/ 07 января 2011

Это зависит. Я почти всегда стараюсь избегать исключений, если это не слишком дорого.

1 голос
/ 07 января 2011

Чисто из ряда инструкций / с точки зрения производительности в течение значительного времени выполнения N, избегание обходится дороже, потому что вы проверяете длину каждый раз для каждого ввода.За исключением, ветвь catch выполняется только в этом случае.

0 голосов
/ 07 января 2011

Исключения следует использовать только для исключительных условий (если нет альтернативы), поэтому вы должны использовать try / catch только тогда, когда происходит что-то необычное, с чем вам все еще нужно иметь дело (всплывающее сообщение об ошибке).

Наличие try / catch также сигнализирует программисту, что может произойти какая-то внешняя ошибка, и ее необходимо устранить.В вашем примере, list, равное нулю, является просто нормальной частью потока выполнения / управления программой, и поэтому в этом нет ничего исключительного.

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

Есть полезное сообщение в блоге о досадном исключении, которое может оказаться полезным

0 голосов
/ 07 января 2011

Создание исключений - дорогостоящая задача, поэтому я всегда стараюсь проверять, а не ловить.

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

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

0 голосов
/ 07 января 2011

ВСЕГДА ВСЕГДА избегайте исключения, если можете.

Исключения должны быть исключительными.

Если вы можете предсказать это, защититесь от этого.

Людям, использующим пустые блоки catch, запрещается использовать компьютер ...

Также быстрее не заходить в блоки ловли.

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