如何在保留JavaScript调试器功能的同时进行优雅的异常处理
您知道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)
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