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

北战南征 提交于 2021-02-19 01:22:12

问题


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 looks 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?


回答1:


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.




回答2:


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.




回答3:


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



来源:https://stackoverflow.com/questions/2412139/how-can-you-bubble-up-errors-so-they-can-be-caught-in-the-same-try-catch-block

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!