/ / Javascript, спробуйте… зловити… ще… нарешті, як Python, Java, Ruby тощо - javascript, try-catch

Javascript спробуй ... зловити ... ще ... нарешті, як Python, Java, Ruby і т. Д. - javascript, try-catch

Як Javascript може дублювати чотири частини try-catch-else-finally модель виконання, яку підтримують інші мови?

Чітке, коротке резюме подано з Python 2.5, що нового. У термінах Javascript:

// XXX THIS EXAMPLE IS A SYNTAX ERROR
try {
// Protected-block
} catch(e) {
// Handler-block
} else {
// Else-block
} finally {
// Final-block
}

Код в Захищений блок виконується. Якщо код видає виняток, Блок-обробник виконується; Якщо не виключено жодного винятку, Інакше блок виконується.

Незалежно від того, що сталося раніше, Фінальний блок виконується після завершення блоку коду та обробки викидів, що виникають. Навіть якщо помилка в Блок-обробник або Інакше блок і з'являється новий виняток, код в Фінальний блок все ще працює.

Зверніть увагу, що різання Інакше блок і вставка в кінці Захищений блок є неправильно. Якщо сталася помилка в Інакше блок, це не повинен обробляти Блок-обробник.

Відповіді:

20 за відповідь № 1

Трохи розширивши ідею jhs, вся концепція може бути поміщена всередину функції, щоб забезпечити ще більшу читабельність:

var try_catch_else_finally = function(protected_code, handler_code, else_code, finally_code) {
try {
var success = true;
try {
protected_code();
} catch(e) {
success = false;
handler_code({"exception_was": e});
}
if(success) {
else_code();
}
} finally {
finally_code();
}
};

Тоді ми можемо використовувати його так (дуже схоже на спосіб python):

try_catch_else_finally(function() {
// protected block
}, function() {
// handler block
}, function() {
// else block
}, function() {
// final-block
});

25 за відповідь № 2

Я знаю, що це старе, але ось таке чисте рішення синтаксису, який, на мою думку, є правильним шляхом:

try {
// Protected-block
try {
// Else-block
} catch (e) {
// Else-handler-block
}
} catch(e) {
// Handler-block
} finally {
// Final-block
}

Код в Захищений блок виконується. Якщо код видає помилку, Блок-обробник виконується; Якщо помилка не буде видана, Інакше блок виконується.

Незалежно від того, що сталося раніше, Фінальний блок виконується після завершення блоку коду та обробки помилок, що виникають. Навіть якщо помилка в Блок-обробник або Інакше блок, код в Фінальний блок все ще працює.

Якщо помилка виявляється в Інакше блок Це є ні обробляється Блок-обробник але замість цього Інший блок-обробник

І якщо ви знаєте, що Інакше блок не кине:

try {
// Protected-block
// Else-block
} catch(e) {
// Handler-block
} finally {
// Final-block
}

Мораль історії, не бійтеся робити відступи;)


7 для відповіді № 3

Javascript не має синтаксису для підтримки сценарію без винятків. Найкраще обхідне рішення - вкладене try висловлювання, подібні до "спадкової" техніки з PEP 341

// A pretty-good try/catch/else/finally implementation.
try {
var success = true;
try {
protected_code();
} catch(e) {
success = false;
handler_code({"exception_was": e});
}
if(success) {
else_code();
}
} finally {
this_always_runs();
}

Окрім читабельності, проблема полягає лише в success змінна. Якщо protected_code набори window.success = false, це не спрацює. Менш читабельний, але безпечніший спосіб використовує простір імен функції:

// A try/catch/else/finally implementation without changing variable bindings.
try {
(function() {
var success = true;
try {
protected_code();
} catch(e) {
success = false;
handler_code({"exception_was": e});
}
if(success) {
else_code();
}
})();
} finally {
this_always_runs();
}

5 за відповідь № 4

Я знаю, що питання старе і відповіді вже дано, але я думаю, що моя відповідь найпростіша, щоб отримати "інше" у javascripts try-catch-block.

var error = null;
try {
/*Protected-block*/
} catch ( catchedError ) {
error = catchedError; //necessary to make it available in finally-block
} finally {
if ( error ) {
/*Handler-block*/
/*e.g. console.log( "error: " + error.message );*/
} else {
/*Else-block*/
}
/*Final-block*/
}