Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Перехват ошибок (https://javascript.ru/forum/misc/35917-perekhvat-oshibok.html)

Little_Cat 26.02.2013 19:51

Перехват ошибок
 
Подскажите пожалуйста. Не могу понять, почему, но номер 1 (первый throw) не вываливается в блок catch() - второй аж бегом.


Подскажите, а то устал искать. Спасибо.

danik.js 26.02.2013 23:21

Код, вставленный скриншотом - да вы извращенец, батенька )
Может потому что выполняется if (false) { if (***) {**} else { trhow .. } } else { throw } ?

Little_Cat 27.02.2013 12:19

Да под вечер было уже лень перебивать. Прошу прощения. Там вложений много. Вот обобщенный код модуля.
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 ошибка то должна попасть.
Спасибо.

Little_Cat 28.02.2013 23:00

Разобрался. Спасибо.

Little_Cat 01.03.2013 14:43

Гм. Можно было просто спросить что именно получилось. Вывел в интерфейс функций вместе с 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);});

danik.js 01.03.2013 15:44

Да, у новичков обычно проблемы с пониманием асинхронности. Отсюда и ноги растут.


Часовой пояс GMT +3, время: 12:10.