2011-01-08 4 views
3

Используя SpiderMonkey, вы можете использовать условные блоки catch для маршрутизации исключений в соответствующий обработчик.V8 эквивалентность улова SpiderMonkey (e, если e ..)

try { 
// function could throw three exceptions 
getCustInfo("Lee", 1234, "[email protected]") 
} 
catch (e if e == "InvalidNameException") { 
// call handler for invalid names 
bad_name_handler(e) 
} 
catch (e if e == "InvalidIdException") { 
// call handler for invalid ids 
bad_id_handler(e) 
} 
catch (e if e == "InvalidEmailException") { 
// call handler for invalid email addresses 
bad_email_handler(e) 
} 
catch (e){ 
// don't know what to do, but log it 
logError(e) 
} 

пример из MDN

Однако в V8 этот код обыкновение компилировать любые предложения или работы обходные, кроме очевидного.

ответ

6

Как я знаю, подобной функции в других машинах JavaScript нет.

Но легко преобразовать код, используя эту функцию:

try { 
    A 
} catch (e if B) { 
    C 
} 

в код, который использует только стандартные функции, что все JavaScript двигатели поддержка:

try { 
    A 
} catch (e) { 
    if (B) { 
     C 
    } else { 
     throw e; 
    } 
} 

пример вы дали еще проще на перевод:

try { 
    getCustInfo("Lee", 1234, "[email protected]"); 
} catch (e) { 
    if (e == "InvalidNameException") { 
     bad_name_handler(e); 
    } else if (e == "InvalidIdException") { 
     bad_id_handler(e); 
    } else if (e == "InvalidEmailException") { 
     bad_email_handler(e); 
    } else { 
     logError(e); 
    } 
} 
+1

Будет ли очевидная вещь, оператор switch может быть даже лучше, ваш верный e нет подобных реализаций? –

+0

Да. Это нестандартное расширение в SpiderMonkey. –

+0

Side Note: это не обрабатывает такие вещи, как трассировки стека, если вы хотите не поймать исключение определенного типа. –

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