Jus*_*tin 26 javascript exception-handling
作为C#开发人员,我习惯了以下异常处理方式:
try
{
throw SomeException("hahahaha!");
}
catch (Exception ex)
{
Log(ex.ToString());
}
Output
------
SomeNamespace.SomeException: hahahaha!
at ConsoleApplication1.Main() in ConsoleApplication1\Program.cs:line 27
Run Code Online (Sandbox Code Playgroud)
它非常简单,但却告诉我关于异常是什么以及它在哪里需要知道的一切.
如何在JavaScript中实现等效的东西,异常对象本身可能只是一个字符串.我真的希望能够知道发生异常的确切代码行,但是下面的代码并没有记录任何有用的东西:
try
{
var WshShell = new ActiveXObject("WScript.Shell");
return WshShell.RegRead("HKEY_LOCAL_MACHINE\\Some\\Invalid\\Location");
}
catch (ex)
{
Log("Caught exception: " + ex);
}
Output
------
Caught exception: [object Error]
Run Code Online (Sandbox Code Playgroud)
编辑(再次):只是为了澄清,这是内部应用程序,大量使用JavaScript.我正在寻找一种从生成系统中可能捕获的JavaScript错误中提取有用信息的方法 - 我已经有了一种日志记录机制,只是希望获得一个合理的字符串来记录.
Nac*_*oma 32
您没有指定是否在浏览器或服务器中工作.如果它是前者,则有一个新的console.error方法和e.stack属性:
try {
// do some crazy stuff
} catch (e) {
console.error(e, e.stack);
}
Run Code Online (Sandbox Code Playgroud)
请记住,错误适用于Firefox和Chrome,但它不是标准配置.一个快速示例,如果没有,将降级console.log并记录:ee.stack
try {
// do some crazy stuff
} catch (e) {
(console.error || console.log).call(console, e.stack || e);
}
Run Code Online (Sandbox Code Playgroud)
use*_*862 21
我知道我在这里参加派对已经晚了4年,但仍然觉得要加2美分的冲动.
正如Eldar指出的那样,您可以使用e.message来获取异常消息.但是,在Chrome,Firefox和IE10 +中,您还可以使用e.stack获取堆栈跟踪.堆栈跟踪将包含异常的文件和行号.
因此,要组装带有异常信息的字符串,您可以编写如下内容:
var exmsg = "";
if (e.message) {
exmsg += e.message;
}
if (e.stack) {
exmsg += ' | stack: ' + e.stack;
}
Run Code Online (Sandbox Code Playgroud)
请注意,如果是,您将只获得堆栈跟踪
所以只抛出一个字符串(抛出'Exception !!')就不会给你一个堆栈跟踪.
为了更进一步,要捕获所有未捕获的异常,您将使用window.onerror处理程序(类似于global.asax中的.Net Application_Error处理程序).以前的缺点(并且大多数情况下仍然是)这不会让您访问实际的异常对象,因此您无法获得堆栈跟踪.您只能获得消息,网址和行号.
最近,该标准已经扩展到为您提供专栏(非常适合缩小文件)和异常对象:http: //www.whatwg.org/specs/web-apps/current-work/multipage/webappapis.html #errorevent
现在(2014年4月),只有Chrome 32实现了这一切.IE10 +为您提供列,但不是异常对象.Firefox 28仍然只为您提供消息,网址和行号.希望这会很快改善.我已经为JSNLog项目撰写了这篇文章,网址为:http://jsnlog.com/Documentation/GetStartedLogging/ExceptionLogging
(免责声明:我是JSNLog和jsnlog.com的作者)
其次,.Net Exception对象支持内部异常.它还具有Data属性,因此您可以使用例如变量值附加键值对.我有点想念JavaScript Error对象,所以我创建了自己的Exception对象,也作为JSNLog项目的一部分.它位于jsnlog.js Github项目(https://github.com/mperdeck/jsnlog.js)的jsnlog.js文件中.
描述位于:http: //jsnlog.com/Documentation/JSNLogJs/Exception
最后一个无耻的插件 - 我正在处理的JSNLog项目允许您在JavaScript中插入记录器,并自动在现有服务器端日志中插入日志消息.因此,要将带有堆栈跟踪的JavaScript异常记录到服务器端日志中,您只需编写:
try {
...
} catch (e) {
JL().fatalException("something went wrong!", e);
}
Run Code Online (Sandbox Code Playgroud)
您几乎可以以相同的方式使用,即.
try
{
throw new Error("hahahaha!");
}
catch (e)
{
alert(e.message)
}
Run Code Online (Sandbox Code Playgroud)
但是如果你想获得引发错误的行号和文件名,我想没有crossbrowser解决方案.消息和名称是Error对象的唯一标准属性.在mozilla中,您还有lineNumber和fileName属性.
| 归档时间: |
|
| 查看次数: |
37232 次 |
| 最近记录: |