2013-07-31 6 views
1

Я по-прежнему относительно новичок в JavaScript, исходя из более классического (например, Java, а также ActionScript 3.0) фона. Я нахожу, что для неправильной реализации API библиотеки/фрейма распространено неправильное распространение вещей в стеке вызовов, без четкого указания на то, что это код приложения (а не код библиотеки).Почему библиотеки JavaScript чаще не используют блоки try-catch?

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

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

+1

Одно слово: производительность. – Pointy

ответ

4

Во-первых, потому что это боль, чтобы поймать одного исключения:

try { 
    doSomething(); 
} catch(e) { 
    if (e instanceof SomeException) { 
     // handle SomeException 
    } else { 
     throw e; // and lose stacktrace information :-(
    } 
} 

и ловить все исключения, как правило, неправильно вещь.

Во-вторых, поскольку иерархия исключений самого JavaScript очень плохо дифференцирует различные виды ошибок и предоставляет информационные свойства о них. JavaScript предпочитает делать что-то, что могло бы означало и тихо ломалось, когда оно не было, чем поднимать ошибку (см. undefined и др.). Это также исторически несовместимо между браузерами (особенно исключениями DOM). Это означает, что нет культуры использования исключений и наследуется в библиотечный дизайн.

+1

@Mike: heh. jQuery - хороший пример того, как исключения используются в реальном JS реального мира: он использует catch-all для поиска ошибок реализации браузера, которые иначе не могут быть обнюханы. – bobince

1

Что сказал бобиндж, но даже упоминание try-catch в вашей функции в настоящее время ничего не значит, что функция будет оптимизирована. См. here, обратите внимание, что JSPerf не предназначен для отображения величины, которая может составлять до 1000 раз (или что-то другое) разницу между оптимизированным и неоптимизированным кодом. Вы можете добавить больше кода в тесты, и вы должны увидеть, что относительная разница увеличивается и увеличивается.

См V8 source и SpiderMonkey bug

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

Смежные вопросы