none
Перехват ошибок в JavaScript RRS feed

  • Вопрос

  • Доброго дня все, уважаемые форумчане. Возникла такая проблема. Не могу понять, почему не выполняется переход в catch() и формировании ошибки в коде.

    try { 
                      if (VisualStateController.getSelectedLine() !== undefined) {
                            switch (tileId) {
                                  case 'InfoDataTile':
                                        sceneDataService.getLineInfo(VisualStateController.getSelectedLine(), function (json) {
                                              if (json.Result === 'OK') {
    												................................................
                                              } else {
                                                    throw new Error('sdfsfsdfsfsdfdsdf');
                                              }
    
                                        });
                                        break;
                                  default:
                                        sceneDataService.getPartialView(tileId, function (json) {
                                              if (json.Result === 'OK') {
    												................................................
    
                                              } else {
    										  Сюда точно попадаем - генерируется исключение
    										  но вместо того, чтобы попасть в catch выше - оно уходит в консоль броузера и отображается там
    										  
                                                    throw new Error('sdfsfsdfsfsdfdsdf');
                                              }
                                        });
                            }
                      } else {
    
                        throw new Error('sdfsfsdfsfsdfdsdf');
                      }
    } catch(e) {
          ................................................
    }
    

    Ошибка генерируется(проверено файрбагом) и выводится. Но все внутренние ошибки браузер кидает на консоль отладки а только ту, которая генерируется непосредственно перед блоком catch в него и попадает. Вопрос, как перехватить остальные throw и засунуть их таки в нужный мне catch()

    Спасибо.

    28 февраля 2013 г. 6:48

Ответы

  • Вопрос. Не связано ли это с асинхронностью вызовов? В моем примере верхнем throw генерируется в коллбэках функций.

    • Помечено в качестве ответа Little_Cat_2003 1 марта 2013 г. 10:31
    28 февраля 2013 г. 14:23

Все ответы

  • Где и в каком браузере выполняется ваш код?
    28 февраля 2013 г. 8:04
    Модератор
  • Мозилла огнелис последний. И IE 9 от проверил  - тоже самое.

    28 февраля 2013 г. 8:22
  • У вас случайно в коде не объявлен глобальный перехватчик ошибок, может вы и не знаете об этом?
    28 февраля 2013 г. 8:38
    Модератор
  • Тогда почему срабатывает throw последний как положено.
     Я сам пишу вроде как код и вот только сейчас возникла необходимость использовать перехват в коде JavaScript.Та что он нигде не объявлен больше.Код модуля выглядит так

    var MyModule = function(){ 
        MyFunc = function(){  
        try{
             вот это все ............
        }catch(){
    
        }
        };
        return{
           MyFunc:MyFunc
        };
    )();

    Непонятно, почему не выполняется переход в блок внешнего catch();


    28 февраля 2013 г. 8:42
  • Вопрос. Не связано ли это с асинхронностью вызовов? В моем примере верхнем throw генерируется в коллбэках функций.

    • Помечено в качестве ответа Little_Cat_2003 1 марта 2013 г. 10:31
    28 февраля 2013 г. 14:23
  • Привет,

    Можете расписать решение более подробно или предоставить источник где Вы нашли решение проблемы.

    Будет полезно для других пользователей с таким же вопросом.

    1 марта 2013 г. 11:07
    Модератор
  • Да, конечно.

    Вывел в интерфейс функций вместе с Callback еще и ErrorCallback и выбрасываю сообщение об ошибке в место вызова функции модуля. Неотработка по месту вероятно как-то связана с асинхронностью работы функций в модуле. Было

    01	try {
    02	                  if (VisualStateController.getSelectedLine() !== undefined) {
    03	                        switch (tileId) {
    04	                              case 'InfoDataTile':
    05	                                    sceneDataService.getLineInfo(VisualStateController.getSelectedLine(), function (json) {
    06	                                          if (json.Result === 'OK') {
    07	                                                ................................................
    08	                                          } else {
    09	                                                throw new Error('sdfsfsdfsfsdfdsdf');
    10	                                          }
    11	 
    12	                                    });
    13	                                    break;
    14	                              default:
    15	                                    sceneDataService.getPartialView(tileId, function (json) {
    16	                                          if (json.Result === 'OK') {
    17	                                                ................................................
    18	 
    19	                                          } else {
    20	                                          Сюда точно попадаем - генерируется исключение
    21	                                          но вместо того, чтобы попасть в catch выше - оно уходит в консоль броузера и отображается там
    22	                                           
    23	                                                throw new Error('sdfsfsdfsfsdfdsdf');
    24	                                          }
    25	                                    });
    26	                        }
    27	                  } else {
    28	 
    29	                    throw new Error('sdfsfsdfsfsdfdsdf');
    30	                  }
    31	} catch(e) {
    32	      ................................................
    33	}

    стало

    01	try {
    02	                  if (VisualStateController.getSelectedLine() !== undefined) {
    03	                        switch (tileId) {
    04	                              case 'InfoDataTile':
    05	                                    sceneDataService.getLineInfo(VisualStateController.getSelectedLine(), function (json) {
    06	                                          if (json.Result === 'OK') {
    07	                                                ................................................
    08	                                          } else {
    09	                                 ErrorCalback(new Error('sdfsfsdfsfsdfdsdf'));
    10	                                          }
    11	 
    12	                                    });
    13	                                    break;
    14	                              default:
    15	                                    sceneDataService.getPartialView(tileId, function (json) {
    16	                                          if (json.Result === 'OK') {
    17	                                                ................................................
    18	 
    19	                                          } else {
    20	                                          Сюда точно попадаем - генерируется исключение
    21	                                          но вместо того, чтобы попасть в catch выше - оно уходит в консоль броузера и отображается там
    22	                                      ErrorCalback(new Error('sdfsfsdfsfsdfdsdf'));
    23	                              
    24	                                          }
    25	                                    });
    26	                        }
    27	                  } else {
    28	 
    29	                   ErrorCalback(new Error('sdfsfsdfsfsdfdsdf'));
    30	                  }
    31	} catch(e) {
    32	      ................................................
    33	}

    ну и в месте вызова функции модуля

    MyMoDule.MyFunc(Param1, functionCallback(data){}, functionErrorCallback(error){ alert(error.message);});

    где

    var MyModule = function(){ 
        MyFunc = function(data,Callback,ErrorCallback){  
        try{
             вот это все ............
        }catch(){
    
        }
        };
        return{
           MyFunc:MyFunc
        };
    )();

    Другого не придумал. Так - работает как нужно.


    1 марта 2013 г. 13:52