2009-08-06 2 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] 

EDIT (еще раз): Просто чтобы прояснить, это для внутреннего применения, которое сильно использует JavaScript. Я получаю возможность извлечь полезную информацию из ошибок JavaScript, которые могут быть пойманы в производственной системе. У меня уже есть механизм ведения журнала, просто хочу получить разумную строку для регистрации.

ответ

3

Вы можете использовать почти таким же образом, т.е.

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

Но если вы хотите, чтобы получить номер строки и имя файла, где брошено ошибки я полагаю, что нет броузеров решения. Сообщение и имя являются единственными стандартными свойствами объекта Error. В mozilla у вас также есть свойства lineNumber и fileName.

+0

Это не работает с сервером. Кроме того, это не современный UX. –

0

Вы можете использовать такие инструменты, как лесозаготовительных Yahoo! UI Library - Logger протоколируются ошибки/информационные сообщения.

2

Я не уверен, является ли это кросс-браузер или, если это то, что вы ищете, но я предлагаю вам попробовать:

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

Я знаю, что я 4 года опоздал на вечеринку здесь , но все же почувствовал желание добавить свои 2 цента.

Как указывает Эльдар, вы можете использовать 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 (аналогично обработчику .Net Application_Error в global.asax).Недостатком этого было (и в основном все еще), что это не даст вам доступ к фактическому объекту исключения, поэтому вы не сможете получить трассировку стека. Вы получите только сообщение, URL и номер строки.

Недавно стандарт был расширен, чтобы дать вам колонку (отлично подходит для уменьшенных файлов) и объект исключения, а также: http://www.whatwg.org/specs/web-apps/current-work/multipage/webappapis.html#errorevent

Сейчас (апрель 2014), только Chrome 32 реализует все это. IE10 + предоставляет вам столбец, но не объект исключения. Firefox 28 все еще дает вам сообщение, URL и номер строки. Надеюсь, это скоро улучшится. Я написал об этом в проекте JSNLog, по адресу: http://jsnlog.com/Documentation/GetStartedLogging/ExceptionLogging

(оговорке: Я автор JSNLog и jsnlog.com)

Во-вторых, объект Exception .Net поддерживает внутренние исключения. Он также имеет свойство Data, поэтому вы можете присоединить пары значений ключа, например, значения переменных. Я вроде пропустил это в объекте JavaScript Error, поэтому создал собственный объект Exception, также как часть проекта JSNLog. Он находится в файле jsnlog.js в проекте jsnlog.js Github (https://github.com/mperdeck/jsnlog.js).

Описание находится по адресу: http://jsnlog.com/Documentation/JSNLogJs/Exception

Наконец бесстыдный плагин - проект JSNLog Я работаю над позволяет вставлять лесорубов в вашем JavaScript, и автоматически вставляет сообщения журнала в существующем журнале на стороне сервера. Таким образом, чтобы войти исключения JavaScript с их трассировки стека в журнале на стороне сервера, вам нужно только написать:

try { 
    ... 
} catch (e) { 
    JL().fatalException("something went wrong!", e); 
} 
+0

Я знаю _I'm_ 3 года опоздал на вечеринку .... но я уверен, что если вы выбросите фактическое исключение (а не только строку), вы получите трассировку стека. Например: «throw new Exception (« Исключение !! »);'. – samson

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

очень полезно, спасибо –

Смежные вопросы