Хорошо ли использовать обработку исключений в этом случае? - PullRequest
2 голосов
/ 03 июня 2011

Я использую этот код в JavaScript.

if(typeof a[x] != "undefined" && typeof a[x][y] != "undefined" && typeof a[x][y][z] != "undefined") {
    a[x][y][z].update();
}
// else do nothing

Я просто подумал, что использование try catch для реализации вышеуказанной логики упростит код и уменьшит проверку трех условий каждый раз. (См. Ниже)

try {
    a[x][y][z].update();
} catch(e) {
}

Хорошо ли использовать try catch в такой ситуации?

Примечание. Если вам интересно, почему я проверяю три условия: a [] [] [] содержит ссылки на объекты, и ссылки добавляются динамически.

Ответы [ 5 ]

2 голосов
/ 03 июня 2011

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

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

var fn = null;

try {
    fn = a[x][y][z].update;
} catch (e) {
    fn = function(){}
}

fn();

или

var fn = null;

try {
    fn = a[x][y][z].update;
} catch (e) {}

fn && fn();
1 голос
/ 03 июня 2011

Хорошо ли использовать try catch в такой ситуации?

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

try {
    a[x][y][z].update();
} catch(e) {
    if (!(e instanceof TypeError))
        throw e;
}

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

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

if (x in a && y in a[x] && z in a[x][y])
    a[x][y][z].update();
1 голос
/ 03 июня 2011

Любое исключение, выброшенное методом .update(), игнорируется, возможно, скрывая ошибки.Обратите внимание, что в исходном примере вам не нужно использовать typeof:

if(a[x] !== undefined && a[x][y] !== undefined && a[x][y][z] !== undefined) {
    a[x][y][z].update();
}
0 голосов
/ 03 июня 2011

Javascript довольно терпим к ошибкам, когда дело касается обработки ложных значений, вы можете сделать что-то вроде:

var v = 
    (a ? (a[x] 
           ? (a[x][y] 
               ? (a[x][y][z] 
                   ? a[x][y][z] : null) 
               : null) 
           : null) 
    : null);

if (v) v.update();
0 голосов
/ 03 июня 2011

Почему явная проверка на неопределенность?

if(a[x] && a[x][y] && a[x][y][z]) {
    a[x][y][z].update();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...