использование исключений в неошибочных целях

Это может быть сделано при помощи развязывать функции.

$('#myimage').unbind('click');

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

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

Взгляд на этот вопрос (это - то, как я узнал о, развязывают). Существует некоторое полезное описание этих стратегий в ответах.

, Как считать связанные функции обратного вызова при наведении курсора в jquery

5
задан chaos 21 July 2009 в 14:52
поделиться

9 ответов

Это зависит от языка. У каждого языка есть свой дизайн и идиомы. Для большинства языков исключения должны быть исключительными.

В таких языках, как C ++, Java и C #, использование исключений для чего-либо еще является очень плохим тоном.

В Python исключения чаще используются для таких вещей, как конец итерации. Существует гораздо больше модели попыток сделать то, что вы хотите, и обработки исключений позже, чем проверки ввода («Проще просить прощения, чем разрешения»). Например, если вы хотите открыть файл, в Java вы можете сначала проверить, существует ли он, а затем открыть его и проверить, есть ли у вас допустимый поток. В Python вы бы открыли его и использовали. Если это не поможет, обработайте исключение.

Из статьи википедии :

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

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

8
ответ дан 18 December 2019 в 05:21
поделиться

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

11
ответ дан 18 December 2019 в 05:21
поделиться

Обычно нет, нет. ASP.NET использует это для Response.Redirect - фактически прерывая поток, затем перехватывая исключение и сбрасывая его. Это очень неприятно, но оно действительно позволяет вам в основном "выйти" из запроса без того, чтобы каждый уровень стека знал, что он должен немедленно вернуться.

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

10
ответ дан 18 December 2019 в 05:21
поделиться

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

3
ответ дан 18 December 2019 в 05:21
поделиться

Нет.

Исключения следует использовать только в исключительных ситуациях (как следует из названия). Это означает: ошибки.

  • «Я не могу найти этот файл». - Исключение!
  • «Я не могу делить на 0». - Исключение!
  • «У меня нет памяти». - Исключение!
  • «Результат 2,5.» - Без исключения!
2
ответ дан 18 December 2019 в 05:21
поделиться

Это очень сомнительная практика. Если вы все равно считаете, что это лучший вариант для вашей ситуации, обязательно задокументируйте и тщательно прокомментируйте его, чтобы снизить WTF / m .

2
ответ дан 18 December 2019 в 05:21
поделиться

Я считаю, что иногда исключения полезны для построения DSL s. Я знаю, это звучит странно, но поскольку во многих языках нет функций, которые есть в Ruby (ключевое слово return необязательно, потому что возвращается результат последнего вычисленного выражения), мы используем то, что можем.

Например, я недавно пытался создать небольшую среду тестирования JavaScript, и мне нужен был способ, чтобы пользователи инфраструктуры могли сказать:

skip();
pending("pending message");
fail("failure message");

вместо:

return skip();
return pending("pending message");
return fail("failure message");

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

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

Вот небольшой пример:

$.it("should offer means to explicitly mark a spec as failed", function() {
    $.fail("this spec must fail");
});
1
ответ дан 18 December 2019 в 05:21
поделиться

Нет.

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

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

1
ответ дан 18 December 2019 в 05:21
поделиться

Ранее я успешно использовал код из лаборатории обработки изображений в проекте кода. (обновление: вот библиотека , которую она использует)

Кристиан Граус (Christian Graus) также написал целую серию по обработке изображений GDI, которую я счел полезной (и имеет перечисленные выше эффекты для возможностей фильтрации).

-121--4013173-

Если необходимо добавить объект nil в коллекцию, используйте класс NSNull :

Класс NSNull определяет одиночный объект, используемый для представления нулевых значений в объектах коллекции (которые не разрешают значения nil).

Предполагается, что «array» имеет тип NSMuterArray:

....
[array addObject:[NSNumber numberWithInt:2];
[array addObject:@"string"];
[array addObject:[NSNull null]];
-121--1033494-

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

Основная функция поиска, частный метод, опускается в дерево поиска, совершая рекурсивные вызовы. нормальный случай - это неспособность решить головоломку, что приводит только к нормальному возврату вызывающему абоненту; исключительный случай - это успех в решении головоломки, и в этом случае мы «бросаем (решаем)» весь путь к пункту улова в публичном методе.

Что-то подобное является известной идиомой в схеме, использующей вызов/cc. Я подражал этому в моей программе C++.

Я был бы рад услышать чьи-либо мнения о таком подходе.

2
ответ дан 18 December 2019 в 05:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: