2013-08-05 3 views
3

Я боролся этим вопросом в течение половины недели без толка, моя проблема:JS Исключение Stack: Разбор JSON

с помощью Node.js 0.10.12 для разбора JSON файлов следующим образом:

var invalidJson = '{ this is bad }'; 



try { 
    JSON.parse(invalidJson); 
} 

catch (exc) { 
    console.log(exc.stack); 
    throw exc; 
} 

выход:

SyntaxError: Unexpected token t 
    at Object.parse (native) 
    at Object.<anonymous> (test.js:7:10) 
    ... 
    at node.js:901:3 

test.js:12 
    throw exc; 

..And then a duplicate of 'SyntaxError: Unexpected token t..' because I re-throw the exception 

Теперь, при выполнении:

JSON.parse(invalidJson); 

без Ьги {} {} улова

Я получаю эту ошибку:

undefined:1 
{ this is bad } 
^
SyntaxError: Unexpected token t 
    at Object.parse (native) 
    at Object.<anonymous> (test.js:17:6) 
    ... 
    at node.js:901:3 

это сообщение об ошибке говорит мне, где именно синтаксический анализ JSON сломался. Когда файл JSON велик, практически невозможно найти ошибку без этих подробностей.

Как передать это описательное сообщение об ошибке в свой собственный try {} catch {} обработчик исключений?

спасибо!

+0

К сожалению, я еще не нашел решение, но кто-то это сделал. Я использую этот онлайн-инструмент для проверки ошибок JSON. Http://www.jsoneditoronline.org/ –

ответ

1

Ну даже с:

$ node --builtins-in-stack-traces test.js 

И test.js:

var invalidJson = '{ this is bad }'; 

//Make err.stack return an array of CallSite objects instead of string 
Error.prepareStackTrace = function(_, stack) { 
    return stack; 
}; 


try { 
    JSON.parse(invalidJson); 
} 

catch (exc) { 
    var asd = exc.stack; 
} 

asd.forEach(function(v){ 
    console.log((v.getMethodName() || v.getFunctionName()) + 
     ":" + v.getLineNumber()); 
}); 

Выход составляет:

MakeGenericError:118 
MakeSyntaxError:324 
parse:56 
null:9 
_compile:456 
.js:474 
load:356 
_load:312 
runMain:497 
startup:119 

Не представляется возможным из Javascript, Вам следует подать ошибка для отображения информации о номере линии JSON для JS с they are obviously accessing it when doing the ^--- thing. JSON не следует писать вручную, поэтому синтаксические ошибки не должны быть общими, если только используемый серийный сериализатор JSON не будет нарушен.

+0

«JSON не следует писать вручную». В самом деле? Какая опция для записи файлов конфигурации? –

+0

@RafaelVega Я думаю, дело в том, что JSON очень многословный и подвержен синтаксическим ошибкам. Хотя что-то вроде YAML менее подробное, более читаемое, подмножество JSON и js-yaml будут давать описательные проблемы синтаксиса. –