2015-09-07 2 views
1

Предположим, у нас есть приложение, и оно работает в window1 (родительское окно). Затем мы открываем дочернее окно (window2), но исполнительный код для него находится в окне1 (прослушиватели событий DOM и т. Д.).Как обработать ошибку в JavaScript из родительского окна, которое произошло в дочернем окне?

Для примера у нас есть кнопка внутри window2, но обработчик события для OnClick события в window1.

Проблема заключается в том, что при наличии некоторой ошибки внутри этого обработчика ошибка ошибки появится внутри окна2 вместе с error.stack и error.message, но в окне1 мы ничего не увидим.

Конечно, мы можем обернуть весь код этого обработчика в try ... catch statement, но мы не получим error.stack и будет только один аргумент в виде строки, содержащей error.message.

Как мне оборачивать каждый обработчик в Try ... Catch заявление имеет несколько минусов:

  1. Дополнительный код
  2. Нет стека ошибок
  3. Иногда мы можем просто забыть добавить Try ... Catch заявление
  4. Хуже читабельность кода

Так, может быть, есть лучший способ справиться с такими ошибками?

ответ

0

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

Дочернее окно:

<!DOCTYPE html> 
<html> 
    <head> 
     <title>error-child</title> 
    </head> 
    <body onerror="window.opener.myErrorHandler(event)"> 
     <h1>error-child</h1> 
     <button onclick="invalidReference.method()">produce error</button> 
     <button onclick="alert('OK')">do something</button> 
    </body> 
</html> 

Родительское окно:

<!DOCTYPE html> 
<html> 
    <head> 
     <title>error-parent</title> 
     <script type="text/javascript"> 
      function myErrorHandler(event) 
      { 
       alert("Parent window has received an error from the child window: "+event); 
      } 
     </script> 
    </head> 
    <body> 
     <h1>error-parent</h1> 
     <button onclick="window.open('error-child.html')">open child window</button> 
    </body> 
</html> 
Смежные вопросы