2015-07-15 4 views
0

Я работаю на АФИ в Node.js и узнал о качестве опции, чтобы дать мои ошибки последний взгляд, прежде чем врезаться мое приложение ... (uncaughtException)uncaughtException не ловить брошенные ошибки

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

Проблема я испытываю это:

создать пользовательские классы ошибок для различных частей кода. например, Redis_Exception, который будет вызван в ответ на ошибки в моем уровне кеша.

Однако следующий не пузырь до моей функции uncaughtException:

throw new Redis_Exception('Some error here'); 

Вместо мое приложение просто выводит Redis_Exception: Some error here на консоль. Нет трассировки стека, как обычно.

Есть ли какая-то причина, по которой ошибки, возникшие таким образом, не будут подниматься до вершины моего процесса приложений?

+1

звучит как что-то еще, поймавшее исключение, прежде чем оно всплыло до события. – hassansin

+0

Да, у меня сложилось впечатление, что это может быть так. Я не написал никакого другого кода для обработки исключений. Я использую экспресс для запросов на маршрутизацию. Возможно, что-то там? –

+0

Обычно ли приложение вызывает сбои, если вы не добавляете обработчик 'uncaughtException'? – loganfsmyth

ответ

0

Выяснено, что это такое. По какой-то причине экспресс решил обработать мои ошибки для меня.

В этом файле /node_modules/finalhandler/index.js on line 67 они в основном обрабатывают любые необработанные ошибки, которые сохраняют uncaughtErrors от пузырьков вверх до вершины стека ... или вниз. Не совсем уверен, в каком направлении эта вещь стоит перед ..: D

Я добавил строку в этот файл и ошибки запуска происходит до моего обработчика исключений:

66  // unhandled error 
67  if (err) { 
68   throw err; //my line 

Я не знаю, как я буду двигаться вперед, зная это, потому что я не хочу перезаписывать основные функции, но теперь я вооружен знаниями.

ОБНОВЛЕНИЕ: После того, как вы открыли билеты с последним торговцем и курьерским, я получил информацию о том, как переопределить функциональность по умолчанию.

Билетов я открываемые:

https://github.com/pillarjs/finalhandler/issues/6 https://github.com/strongloop/express/issues/2707

В принципе, если вы оберните ваш объект приложения в новом сервере HTTP вы можете отменить последнее событие с вашей собственной окончательной функцией.

var express = require('express') 
var http = require('http') 

var app = express() 

// declare things on app 

var server = http.createServer(function (req, res) { 
    app(req, res, function (err) { 
    // this is your replacement for finalhandler 
    }) 
}) 

server.listen(3000) 
+0

Это другой пакет, чем экспресс. – hassansin

+0

Да. finalhandler используется в выражении как конечная функция в своей цепочке событий. Я уточню свой ответ с более подробной информацией. –

3

Простой способ поместить его, добавить промежуточное программное обеспечение с вашим экспресс-сервером с 4 аргументами, первый аргумент которого является ошибкой. Это переопределит обработчик .

app.use((err, req, res, next) => { 
    // Similar to uncaughtException handler 
    // Log error, maybe send it to central server 
    // Send Custom Log message maybe? 
    return res.send('Nice server error to user'); 
} 

Вы также должны по-прежнему держать process.on('uncaughtException', fn); обрабатывать любые пойманные исключения вне трубопровода ответа HTTP запроса.

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