开发者

How can you bubble up errors so they can be caught in the same try/catch block?

开发者 https://www.devze.com 2022-12-22 21:57 出处:网络
I\'ve got an object with functions that throw errors, myObj = { ini:function(){ this.f(); }, f:function(){

I've got an object with functions that throw errors,

myObj = {
  ini:function(){
    this.f();
  },
  f:function(){
   throw new Error();
  } 
};

but I only want to catch the exceptions where the object is created

try{
  var o = new myObj();
}catch(err){
  alert("error!");
}

it loo开发者_开发知识库ks like i have to have try/catch blocks everywhere =/ to capture the error event in different function scopes

try{
    myObj = {
      ini:function(){
        try{
          this.f();
        }catch(err){
         alert("f threw an err");
        }
      },
      f:function(){
       throw new Error();
      } 
    };
}catch(err){
 alert("error happend while crating Obj");
}

But I only want to capture from one place =/ How do I do this?


Have your function throw a specific type of object, and then in your catch block check to see if (err instanceof MyExceptionObj) and handle appropriately, otherwise re-throw it.

By re-throw I mean:

If the caught exception object isn't one you can handle, you should re-throw it to give any catch blocks further up a chance to handle it. If none do, the browser will catch it and display a JS error.

try {
   if ($.browser.msie) {
      throw new UnsupportedBrowserException();
   }
} catch (ex) {
   if (ex instanceof UnsupportedBrowserException) {
      alert('Your browser isn't supported.');
   } else {
      // We don't know how to handle this exception, throw it back.
      throw ex;
   }
}

You probably wouldn't do this in the real world.


You can only conditionally catch exceptions in JavaScript 1.7 and higher. Refer to the following:

try {
  0();
} catch (ex if ex instanceof TypeError) {
  // only catch TypeErrors
}

Otherwise, you have to catch all exceptions, do an instanceof check, and then rethrow the exceptions if the check returns true.


maybe instead of throwing an error and then catching it, you could just call a function.

0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号