2009-08-06 68 views
13

正如我已經習慣了的異常處理下面的樣式C#開發人員:如何記錄異常在JavaScript

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錯誤中提取有用信息的方式之後 - 我已經有一個日誌記錄機制,只是想獲得一個明智的字符串來記錄。

回答

3

你可以使用幾乎相同的方式,即。

try 
{ 
    throw new Error("hahahaha!"); 
} 
catch (e) 
{ 
    alert(e.message) 
} 

但是,如果你想要得到行號和文件名錯誤被拋出,我想沒有crossbrowser解決方案。消息和名稱是Error對象的唯一標準屬性。在mozilla中,你也有lineNumber和fileName屬性。

+0

這不適用於服務器端。另外,它不是現代用戶體驗。 – 2016-01-21 14:59:19

2

我不知道它是否是跨瀏覽器,或者如果它是你在找什麼,但是我建議你試試:

window.onerror = function (err, file, line) { 
    logError('The following error occurred: ' + 
    err + '\nIn file: ' + file + '\nOn line: ' + line); 
    return true; 
} 
15

我知道我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; 
} 

注意,如果

  1. 異常被瀏覽器引發的,你只會得到一個堆棧跟蹤(如響應 語法錯誤);
  2. 該異常對象是一個Error對象或具有Error對象作爲其原型。

所以只是拋出一個字符串(拋出'異常!!')不會給你一個堆棧跟蹤。要進一步捕獲所有未捕獲的異常,可以使用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)

其次,淨異常對象支持內部異常。它還具有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); 
} 
+0

我知道_我3年晚了......但我敢肯定,如果你拋出一個實際的異常(不只是一個字符串),你會得到這個堆棧跟蹤。像這樣:'拋出新的異常('異常!!');'。 – samson 2017-06-13 21:44:40

22

如果你是在瀏覽器或服務器工作不指定。如果是前者,有一個新的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); 
} 
+0

非常有用,謝謝 – 2017-08-31 12:54:34