Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/379.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在保留JavaScript调试器功能的同时进行优雅的异常处理_Javascript_Debugging_Exception_Exception Handling_Firebug - Fatal编程技术网

如何在保留JavaScript调试器功能的同时进行优雅的异常处理

如何在保留JavaScript调试器功能的同时进行优雅的异常处理,javascript,debugging,exception,exception-handling,firebug,Javascript,Debugging,Exception,Exception Handling,Firebug,您知道JavaScript基本上可以抛出任何对象,甚至原语作为异常: throw 1; throw { text: "hello" } 不幸的是,像Firefox这样的调试器会将异常记录到控制台中,包括一个指向代码行的链接,如果我们抛出内置的Errorobject,就会抛出异常 为了解决这个限制,我想:为什么我不重写toString,我给出一个异常实例作为Error构造函数的参数,这样异常就会隐式转换为string var ArgumentException = function(args)

您知道JavaScript基本上可以抛出任何对象,甚至原语作为异常:

throw 1;
throw { text: "hello" }
不幸的是,像Firefox这样的调试器会将异常记录到控制台中,包括一个指向代码行的链接,如果我们抛出内置的
Error
object,就会抛出异常

为了解决这个限制,我想:为什么我不重写
toString
,我给出一个异常实例作为
Error
构造函数的参数,这样异常就会隐式转换为
string

var ArgumentException = function(args) {
   this._argName= args.argName;
}

ArgumentException.prototype = {
    _argName: null,

    get argName() { return this._argName; },

    toString: function() { 
       return "ArgumentException was thrown. Affected argument: " + this.argName;
    }
};

throw Error(new ArgumentException({ argName: "someArgument" }));
显然,上面的代码清单是对实际情况的简化

好的,这样可以解决整个问题

但这就扼杀了使用异常的目的,因为
try/catch
无法按类型处理异常:

try
{
    throw Error(new ArgumentException({ argName: "someArgument" }));
} catch(e) {
    if(e instanceof ArgumentException) {
         // This will happen never! "e" will hold a Error instance!!!!
    }
}
如何解决这个问题?事实上,这是Web浏览器调试器的问题,而不是实际JavaScript的问题,但由于调试是任何开发周期中的一个重要环节,因此应该认真对待

先谢谢你

编辑 我想分享我的另一个结论:

try
{
    debugger;
    throw new ArgumentException({ argName: "someArgument" });
} catch(e) {
    if(e instanceof ArgumentException) {

    }
}

上述解决方案会将异常记录到调试器控制台,但会在抛出之前停止调试器。好的,您没有获得到确切行的链接,但是调试器会在那里停止,这样您就可以知道异常将被抛出到哪里。

为什么不让您的异常从错误继承


有关更多信息,请查看

为什么要用
错误
包装您的
ArgumentException
?@PaulS。你需要再读一遍我的问题!!我在问题中解释说:D@PaulS. 也许我可以添加一些信息:在保留引发异常的链接的同时,用异常消息将错误记录到控制台。我没有尝试
对象。创建
继承错误,但使用
新建
操作符。让我做一个jsFiddle,试试你的方法。听起来不错!好的,你做到了;)
new
继承错误原型的方法是一个很大的失败,因为仅仅执行
newerror()
就会抛出错误。但是
Object.create
没有这个问题。很好,保罗S。!感谢您的努力:)
function ArgumentException(data) {
    this.name = "ArgumentException";
    this.message = arguments.length ? 'Affected argument: ' + data.argName : "Illegal argument";
}
// set up inheritance
ArgumentException.prototype = Object.create(Error.prototype);
ArgumentException.prototype.constructor = ArgumentException;

// use it 
try {
    throw new ArgumentException({argName: "someArgument"});
} catch(e) {
    if(e instanceof ArgumentException) {
        console.log(e); // hi there
    }
}
// see it normally
throw new ArgumentException({argName: "someOtherArgument"});
// ArgumentException: Affected argument: someOtherArgument