Я думаю, что ваша главная проблема в том, что вы глотаете исключения, а это очень плохо . Вот почему "это иногда работает". Что-то вызывает исключение, и вы его ловите, но после этого вы больше ничего не делаете. По крайней мере, я бы отобразил какое-то сообщение об ошибке в вашем блоке catch
.
Несколько других проблем:
- Вы уверены, что вам нужны эти несколько
try..catch
блоков? Текущее предположение в вашем коде состоит в том, что каждая строка, заключенная в try..catch
, не зависит от других, и выполнение может продолжаться, если что-то пойдет не так в одном (или нескольких) из этих операторов. Вы уверены, что это то, что вы хотите? Если так, то определенно есть лучший способ справиться с этим.
- Если операторы не независимы друг от друга, и если сбой в любой момент означает, что выполнение не может продолжаться, то вы можете заключить все эти операторы в один
try..catch
заблокировать и отобразить сообщение об ошибке в catch
- Как я уже говорил, проглатывание исключений очень плохо ! Вы скрываете проблему и ничего не добиваетесь. Это также делает отладку чрезвычайно сложной, потому что все перестает работать, и вы не будете знать, почему (без исключений, без регистрации, без сообщений об ошибках). Исключения используются, когда происходит что-то неожиданное, что прерывает нормальный ход программы. Это то, с чем вы определенно хотите справиться.
Я думаю, что вы можете сделать это следующим образом:
try {
if(window.opener.hideRecordReload){
window.opener.hideRecordReload(pg.recordID, pg.recordTypeID);
} else {
window.opener.pg.hideRecord(pg.recordID, pg.recordTypeID);
}
window.opener.pg.hideEncounter(pg.recordID);
window.opener.pg.hideRecordResponse(pg.hideReasonID.value == 0 ? pg.otherReason.value : pg.hideReasonID.options[pg.hideReasonID.selectedIndex].text);
window.opener.pg.hideRecord_Response(pg.recordID, pg.recordTypeID);
window.opener.pg.hideRecord_Response(pg.recordID, pg.recordTypeID);
window.opener.window.parent.frames[1].pg.loadQualityMeasureRequest();
window.opener.pg.closeWindow();
}
catch(e) {
console.log(e);
}
Таким образом, если исключение возникает в любом месте этих серий операторов, блок catch
будет обрабатывать его.
Javascript также не имеет проверенных исключений. Вы можете обойти это, имея один блок try и проверяя объект исключения, который вы получаете *.
Расширяя то, о чем я говорил ранее, есть два способа обработки исключений. Первый способ, как я показал ранее, предполагает, что когда происходит исключение, код находится в недопустимом / неопределенном состоянии, и это означает, что в коде произошла неисправимая ошибка. Другой способ обработки исключений, если вы знаете, что это то, что вы можете восстановить. Вы можете сделать это с флагом. Итак:
try {
doSomething();
}
catch(e) {
error = true;
}
if(error) {
doStuffToRecoverFromError();
}
else {
doOtherStuff();
}
В этом случае поток вашей логики зависит от создаваемого исключения. Важно то, что исключение подлежит восстановлению, и в зависимости от того, было ли оно выброшено, вы делаете разные вещи.
* Вот несколько надуманный пример, который демонстрирует проверенные исключения. У меня есть два исключения: VeryBadException
и ReallyBadException
, которые могут быть выброшены (случайным образом) из двух функций. Блок catch
обрабатывает исключение и определяет тип его исключения с помощью оператора instanceof
):
function VeryBadException(message) {
this.message = message;
}
function ReallyBadException(message) {
this.message = message;
}
function foo() {
var r = Math.floor(Math.random() * 4);
if(r == 2) {
throw new VeryBadException("Something very bad happened!");
}
}
function bar() {
var r = Math.floor(Math.random() * 4);
if(r == 1) {
throw new ReallyBadException("Something REALLY bad happened!");
}
}
try {
foo();
bar();
}
catch(e) {
if(e instanceof VeryBadException) {
console.log(e.message);
}
else if(e instanceof ReallyBadException) {
console.log(e.message);
}
}