Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 23.01.2012, 01:24
Аватар для Родзевич Олег
Интересующийся
Отправить личное сообщение для Родзевич Олег Посмотреть профиль Найти все сообщения от Родзевич Олег
 
Регистрация: 08.04.2010
Сообщений: 16

try/catch асинхронных действий
Приветствую всех!

Вопрос по nodejs. Подскажите - как ловить ексепшены асинхронных действи?

Вот пример кода:
try {

    var http = require('http');

    http.createServer(function (req, res) {
        res.writeHead(200, {'Content-Type': 'text/html'});
        res.end('Hello World\n');
    }).listen(8080, function () {
        console.log("Server start");
        console.log(JSON.stringify(arguments));
    }).listen(8082, function () {
        console.log("Server start");
        console.log(JSON.stringify(arguments));
    });

} catch (error) {
    // сюда код не доходит!!!
    console.log("Error"+error);
}


Предположим, что у меня на сервере один из портов занят, например, 8080, то конструкция listen выдает ошибку. Ситуация вполне рядовая, необходимо эту ошибку впоймать и как-то её обработать. Стандартные средства try/catch не подходят, в данном примере вываливается необработанный эксепшен и останавливается процесс.

Подозреваю, что это связано с асинхронными действиями.
Ребята, подскажите, как с этим бороться?
Ответить с цитированием
  #2 (permalink)  
Старый 23.01.2012, 02:27
Аватар для Riim
Рассеянный профессор
Отправить личное сообщение для Riim Посмотреть профиль Найти все сообщения от Riim
 
Регистрация: 06.04.2009
Сообщений: 2,379

uncaught exception
Ответить с цитированием
  #3 (permalink)  
Старый 23.01.2012, 14:14
Аватар для Родзевич Олег
Интересующийся
Отправить личное сообщение для Родзевич Олег Посмотреть профиль Найти все сообщения от Родзевич Олег
 
Регистрация: 08.04.2010
Сообщений: 16

А специалистов по ноде нет?
Ответить с цитированием
  #4 (permalink)  
Старый 23.01.2012, 14:45
Новичок на форуме
Отправить личное сообщение для Kolyaj Посмотреть профиль Найти все сообщения от Kolyaj
 
Регистрация: 19.02.2008
Сообщений: 9,177

Все callback-и в nodejs получают первым аргументом объект ошибки, если была ошибка. Но в случае занятого порта, скорее всего только http://nodejs.org/docs/latest/api/pr...ughtException_
Ответить с цитированием
  #5 (permalink)  
Старый 23.01.2012, 15:15
Аватар для Родзевич Олег
Интересующийся
Отправить личное сообщение для Родзевич Олег Посмотреть профиль Найти все сообщения от Родзевич Олег
 
Регистрация: 08.04.2010
Сообщений: 16

Сообщение от Kolyaj Посмотреть сообщение
Все callback-и в nodejs получают первым аргументом объект ошибки, если была ошибка. Но в случае занятого порта, скорее всего только http://nodejs.org/docs/latest/api/pr...ughtException_
Нет, это совершенно не так!

Ловить глобальные необработанные ексепшены - это кастыльное решение, годится только для того, чтобы сервак не рухнул. А мне необходимо чтобы я мог ловить ексепшены в текущем контексте. Решение, я думаю, должно быть связано с тиками и с очередью исполнения. Нарыто очень много информации, решения есть, но они опять таки какието кривые.

Например, https://github.com/CrabDude/trycatch
Ответить с цитированием
  #6 (permalink)  
Старый 23.01.2012, 15:37
Аватар для vflash
Профессор
Отправить личное сообщение для vflash Посмотреть профиль Найти все сообщения от vflash
 
Регистрация: 09.07.2007
Сообщений: 304

у сервера есть событие 'clientError'. можно попробовать повешать на него и намеренно попытаться сделать неверное соединение на занятый порт serv.listen(22, function () {})

в исходиках ноды часто бывает что если нет слушателя то генерируется исключение. а если есть то исключения не будет. смотрите исходники , в ноде многое написано на js.
__________________
лучшая rss читалка zzreader.com

Последний раз редактировалось vflash, 23.01.2012 в 15:40.
Ответить с цитированием
  #7 (permalink)  
Старый 23.01.2012, 15:57
Аватар для Родзевич Олег
Интересующийся
Отправить личное сообщение для Родзевич Олег Посмотреть профиль Найти все сообщения от Родзевич Олег
 
Регистрация: 08.04.2010
Сообщений: 16

Сообщение от vflash Посмотреть сообщение
у сервера есть событие 'clientError'. можно попробовать повешать на него и намеренно попытаться сделать неверное соединение на занятый порт serv.listen(22, function () {})
это не подходит

var cli = require('cli');
var error = require('error');

    var http = require('http');

    http.createServer(function (req, res) {
        res.writeHead(200, {'Content-Type': 'text/html'});
        res.writeHead(200, {'Server': 'nginx/1.0.5'});
        res.end('Hello World\n');
    }).on("clientError", function (error) {
        cli.fatal(error);
    }).
    listen(8080, function () {
        console.log("Server start");
        console.log(JSON.stringify(arguments));
    }).listen(8082, function () {
        console.log("Server start");
        console.log(JSON.stringify(arguments));
    });


ошибки не ловятся
Ответить с цитированием
  #8 (permalink)  
Старый 23.01.2012, 16:59
Аватар для vflash
Профессор
Отправить личное сообщение для vflash Посмотреть профиль Найти все сообщения от vflash
 
Регистрация: 09.07.2007
Сообщений: 304

так воде работает
var http = require('http');

var serv = http.createServer(function (req, res) {
        res.writeHead(200, {'Content-Type': 'text/html'});
        res.writeHead(200, {'Server': 'nginx/1.0.5'});
        res.end('Hello World\n');
}).on("error", function (err) {
        console.log(err)
});

serv.listen(22, function () {
        console.log("Server start");
        console.log(JSON.stringify(arguments));
});
__________________
лучшая rss читалка zzreader.com
Ответить с цитированием
  #9 (permalink)  
Старый 23.01.2012, 17:03
Новичок на форуме
Отправить личное сообщение для Kolyaj Посмотреть профиль Найти все сообщения от Kolyaj
 
Регистрация: 19.02.2008
Сообщений: 9,177

Сообщение от Родзевич Олег
Нет, это совершенно не так!
Что совершенно не так?
Ответить с цитированием
  #10 (permalink)  
Старый 23.01.2012, 21:03
Аватар для Родзевич Олег
Интересующийся
Отправить личное сообщение для Родзевич Олег Посмотреть профиль Найти все сообщения от Родзевич Олег
 
Регистрация: 08.04.2010
Сообщений: 16

vflash, спасибо, так заработало, данную конкретную проблему решило.
Но всетаки хотелось бы понимать как ловить ошибки асинхронных процессов.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Логика действий на примере цикла for ufaset Общие вопросы Javascript 1 27.11.2011 22:04
Обработать несоклько действий DorianLeroy jQuery 2 31.08.2011 17:17
Объясните пожалуйста порядок действий lukingnu AJAX и COMET 9 26.03.2011 10:35
Запоминание действий serg_29rus Общие вопросы Javascript 4 25.01.2011 21:03
Скрипт - автоматизация повторяющихся действий rom4ik Работа 10 21.07.2010 14:01