Как вы делаете вещи в соответствии с брошенным значением? - PullRequest
0 голосов
/ 29 декабря 2010

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 ]

2 голосов
/ 29 декабря 2010

Просто поймайте объект и оцените его в одном 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 голосов
/ 29 декабря 2010

Вы можете сделать это с помощью оператора 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
}
...