2011-10-31 41 views
1

UPDATE 如何创建,设计和扔内置错误对象


[重写的问题集中在我试图理解这个问题。]

有没有在JavaScript中抛出异常一种手段通知发生问题的行号?类似于C#的调试器,如果在第50行发生错误,则我将被带到第50行。

例如,根据MDNEvalError表示与eval()错误。所以,假设我有一个使用eval()的函数。我想用一个特定的错误是代表手头的问题,EvalError

//As written here the error implies there is a problem on this line. See Firebug console window 
var evalErra = new EvalError('required element missing from evaluation'); 

var stringFunc = "a=2;y=3;document.write(x*y);"; 

EvalString(stringFunc); 

function EvalString(stringObject) { 
    //Some arbitrary check, for arguments sake let's say checking for 'x' makes this eval() valid. 
    if(stringObject.indexOf('x') !== -1) { 
     throw evalErra; 
     //throw 'required element missing from evaluation';//This way offers no line number 
    } 
    eval(stringFunc);//The problem really lies in the context of this function. 
} 

如果我要对此都错了,那么请告诉我,我应该如何处理这些类型的问题。

回答

1

当你抛出一个错误时,当前代码的执行将停止,并且JS将以其备份执行树的方式工作,直到它找到catch(),它处理被抛出的特定类型的错误,或者一直到树的顶端,导致一个“未处理的异常”错误:你抛出一个错误,没有任何东西抓住它,现在有人的窗户坏了。

try { 
    if (true) { 
     throw 'yup' 
    } 
} catch (e) { // catches all errors 
    ... handle the error 
} 
+0

为什么我会看到未捕获的文字字符串错误和未捕获的类型错误EvalError之间的区别? –

+0

你可以扔任何你想要的东西。在'yup'的情况下,你会抛出一个硬编码的字符串,这基本上没有意义。这可能是'扔'哇,真的不是真的,'这会更有帮助。至于EvalError,你会抛出整个对象,并且对象被使用/引用的唯一时间就是它被实例化的那一行,所以这就是错误被报告的地方。 –

+0

更新了问题,尝试将范围缩小到我想解决的问题。 –

1

在做错误处理要做到以下

throw new Error("message");

然后,如果你曾经在err.stack(火狐/歌剧/铬)或err.line(Safari浏览器),或者err.IE_Y_U_NO_SHOW_ME_ERROR_LINE_NUMBER处理此错误的样子(IE)查找行号。

如果你想要你可以继承Error