2014-10-09 3 views
1

При принятии решения о том, игнорировать ли дескриптор ошибок повторного броска в структуре Try Catch, что является наилучшим способом однозначной идентификации точной ошибки?Условная обработка ошибок в Javascript

Я не могу найти номер стандартной ошибки, мне нужно разобрать name и message свойства?

EDIT: В приведенном ниже примере я хочу проверить, является ли ошибка из-за отсутствия свойства в элементе listEvent who, является значением evnt.type. Если это источник ошибки, я хочу проигнорировать ее, иначе я хочу перебросить ее, чтобы она могла пузыриться.

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

try{ 
    listEvent[evnt.type](procedure) 
}catch(error){ 
    if (error.message.match(evnt.type)) { 
     console.log(error.name + ' ' + error.message + ' - ignored') 
    } else { 
     throw error 
    } 
} 
+0

Ну, какую ошибку вы ищите? В JS нет «стандартных номеров ошибок», каждый катит свою собственную вещь (в основном создавая структуры подкласса «Error») – Bergi

+0

@Bergi Im хочет однозначно определить, какая стандартная ошибка произошла, чтобы я мог решить, что с этим делать. Так что я могу направить код для обработки, принятия или повторного броска. Существует ли канонический метод для этого в JS? Или, как указано в моем вопросе, я просто разбираю сообщение? –

+0

Являются ли эти пользовательские исключения, которые вы бросаете? –

ответ

1

Создание пользовательских исключений, а затем использовать instanceof:

function IllegalArgumentException(message) { 
    this.message = message; 
} 

Вы также хотите чтобы сделать его продлить Error прототип:

IllegalArgumentException.prototype = new Error(); 
IllegalArgumentException.prototype.constructor = Error; 

что вы можете т курица использовать так:

throw new IllegalArgumentException("Argument cannot be less than zero"); 

Вы можете проверить тип с помощью instanceof:

try { 
    // Some code that generates exceptions 
} catch (e) {  
    if (e instanceof IllegalArgumentException) { 
     // Handle this 
    } else if (e instanceof SomeOtherTypeOfException) { 
     // Handle this 
    } 
} 

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

Что касается вашего примера, я не уверен, что вы пытаетесь сделать. listEvent[evnt.type] вернет undefined, если event.type не является собственностью или ключом listEvent. Лучше узнать, существует ли даже evnt.type, выполнив что-то вроде этого:

if (typeof listEvent[evnt.type] !== "undefined") { 
    listEvent[evnt.type](procedure); 
} 
+0

"listEvent [evnt.type] вернет undefined, если event.type не является свойством или ключом в спискеEvent". Это может быть так, но listEvent [evnt.type]() - обратите внимание на вызов - выдает ошибку. –

+1

@CoolBlue Конечно. Вы пытаетесь вызвать значение 'undefined' как функцию.Я говорю, что лучше проверить и посмотреть, есть ли у вас даже свойство с этим именем, прежде чем вы его назовете. Таким образом, вам не нужно иметь дело с проверкой, чтобы увидеть, что было в исключении. –

+0

Хорошо, спасибо за совет ... мне кажется, что шесть из полутора десятков других. Я думаю, что ответ на мой вопрос заключается в том, что нет простого и надежного способа однозначной идентификации стандартной ошибки и ее обычной практики. Лично я предпочитаю структуру catch try, потому что она выполняется только в случае сбоя кода. Ваше предложение срабатывает каждый раз, и это только более эффективно, если «исключение» - это правило, которое в моем случае его нет. Приветствия. –

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