2010-12-29 2 views
0

MDC говорит, чтобы сделать это, но также говорит, что они думают, что это просто расширение FireFox:Как вы делаете что-то в соответствии с брошенной стоимостью?

живой код: http://jsfiddle.net/vQsUX/

try { 
    throw("InvalidNameException"); 
} 

catch (e if e == "InvalidNameException") { 
    document.write(e) 
} 

catch (e if e == "InvalidIdException") { 
    document.write(e) 
} 

catch (e if e == "InvalidEmailException") { 
    document.write(e) 
} 

Как я могу сделать подобную вещь, которая будет работать для всех браузеров?

ответ

2

Просто поймать объект и оценить его в одном блоке catch:

try { 
    // stuff 
} 
catch (exc) { 
    if (exc === "InvalidNameException") { 
    // do something 
    } 
    else if (exc === "whatever") { 
    // do something else 
    } 
} 

Поскольку исключения только объекты, и вы можете throw все, что вы хотите, вы всегда можете разработать свои собственные более сложные структуры исключений. Объекты исключения могут иметь код для запуска, числовые ключи, все, что вам нужно. Тем не менее, я не нашел много пользы для сложного механизма исключения в Javascript; это просто не похоже на многое. Тем не менее:

function riskyCodeHere() { 
    // scary dangerous things 
    if (badThings()) { 
    throw { 
     key: 207, 
     badnessLevel: "terrible", 
     toString: function() { 
     return "Things have gotten " + this.badnessLevel; 
     } 
    }; 
    } 
} 

// ... 

try { 
    riskyCodeHere(); 
} 
catch (b) { 
    switch (b.key) { 
    case 207: console.log(b.toString()); 
    // ... 
    } 
} 
+0

+1, хорошо! первый раз, чтобы увидеть это использование броска! что-то действительно «плохое» происходит там! :-) – ifaour

+0

Спасибо! Могу ли я спросить, с чем работает 'toString: function() {}'? – DarkLightA

+0

О, это был просто пример; это может быть полезно для целей отладки или чего-то еще. Класс исключений может предоставить свой собственный API протоколирования или что-то подобное. Дело было в том, чтобы показать, что вы можете «бросить» объект любого размера или формы. – Pointy

0

Вы можете сделать это с switch заявлением:

try { 
    throw("InvalidNameException"); 
} 
catch (e) { 
    switch (e.toString()) { 
     case "InvalidNameException": 
      document.write(e); 
      break; 

     case "InvalidIdException": 
      document.write(e); 
      break; 

     case "InvalidEmailException": 
      document.write(e); 
      break; 
    } 
} 

Это не так хороша, как расширение Firefox, но это делает почти то же самое.

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

try { 
    throw new MyNiftyException(...); 
} 
catch (e) { 
    if (e instanceof MyNiftyException) { 
     // Do something related to that 
    } 
    // etc 
}