作为C#开发人员,我习惯了以下异常处理方式:
try
{
throw SomeException("hahahaha!");
}
catch (Exception ex)
{
Log(ex.ToString());
}
Output
------
SomeNamespace.SomeException: hahahaha!
at ConsoleApplication1.Main() in ConsoleApplication1\Program.cs:line 27
它非常简单,但却告诉我关于异常是什么以及它在哪里需要知道的一切。
如何在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]
编辑(再次):为了澄清,这是针对大量使用JavaScript的内部应用程序。我正在寻找一种从生产系统中可能捕获的JavaScript错误中提取有用信息的方法 - 我已经有了一种记录机制,只是希望获得一个合理的字符串来记录。
答案 0 :(得分:29)
您不指定您是在浏览器还是服务器中工作。如果是前者,则会有一个新的console.error方法和e.stack属性:
try {
// do some crazy stuff
} catch (e) {
console.error(e, e.stack);
}
请记住,错误适用于Firefox和Chrome,但它不是标准配置。一个快速示例,如果没有console.log
,将降级为e
并记录e.stack
:
try {
// do some crazy stuff
} catch (e) {
(console.error || console.log).call(console, e.stack || e);
}
答案 1 :(得分:21)
正如Eldar指出的那样,您可以使用e.message
来获取异常消息。但是,在Chrome,Firefox和IE10 +中,您还可以使用e.stack
获取堆栈跟踪。堆栈跟踪将包含异常的文件和行号。
因此,要组装带有异常信息的字符串,您可以编写如下内容:
var exmsg = "";
if (e.message) {
exmsg += e.message;
}
if (e.stack) {
exmsg += ' | stack: ' + e.stack;
}
请注意,只有
才能获得堆栈跟踪所以只抛出一个字符串(抛出'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);
}
答案 2 :(得分:6)
您几乎可以使用相同的方式,即
try
{
throw new Error("hahahaha!");
}
catch (e)
{
alert(e.message)
}
但是如果你想获得引发错误的行号和文件名,我想没有crossbrowser解决方案。消息和名称是Error对象的唯一标准属性。在mozilla中,您还有lineNumber和fileName属性。
答案 3 :(得分:2)
我不确定它是否是跨浏览器或者它是否正在寻找,但我建议您尝试:
window.onerror = function (err, file, line) {
logError('The following error occurred: ' +
err + '\nIn file: ' + file + '\nOn line: ' + line);
return true;
}
答案 4 :(得分:0)
几乎完全相同,请参阅手册:https://developer.mozilla.org/en/Core_JavaScript_1.5_Guide/Exception_Handling_Statements/try...catch_Statement
答案 5 :(得分:0)
您可以使用Yahoo! UI Library - Logger等日志记录工具记录错误/信息性消息。
答案 6 :(得分:0)
我有类似的问题。
使用console.table(error);
对我来说效果很好。
它在表格中显示信息,还允许我展开/折叠以查看更多详细信息。
答案 7 :(得分:0)
我为它写了一个方便的函数
const logError = (e: any) => {
if (console.error) console.error(e, e.stack);
else console.log(e)
}