[107] Web においてスクリプトのエラーは、 error
イベントとして通知されます。このイベントが所定の手順で処理されない場合、
利用者に通知されます。
[108] スクリプトの構文解析の失敗やスクリプト内で例外が投げられてそれが catch されない場合など、スクリプトの処理中に検出されスクリプト内で直接処理されなかった失敗が本項でいうエラーです。
[109] エラーはまずエラーの報告手順に引き渡されて、 エラーを処理するために事前に登録されたスクリプトによって扱おうとします。
[110] そのようなスクリプトが存在しない場合や、処理できないとされる場合、 エラー処理中にエラーが発生した場合には、このエラーを利用者に報告することができます。
[57] 仕様書上の手順としてエラーがどのように処理されるかは、 エラーが静的 (構文解析、コンパイル等で検出されるエラー) か動的 (実行時エラー、 catch されない例外など) か、スクリプトが仕様書上どのように定義されているかによって異なります。
[59] イベントハンドラーの静的エラーについては、 get the current value of the event handler 手順からエラーの報告手順が呼び出されます。 (イベントハンドラーの項を参照。)
[76] ワーカーのスクリプトで catch されていないエラーが発生した時は、
WorkerGlobalScope
を対象としてエラーを報告しなければなりません。
それによってエラーが取り扱われなかった場合は、次のようにします。 >>75
ErrorEvent
と同じ値でいいのでしょうか。 (たとえ起源が違っていたとしても、 postMessage
によって通信できるワーカーからの情報なので、起源を超えた情報の漏洩には当たらないはずです。[148] 開発者ツールのコンソールから実行したスクリプトのエラーについてエラーの報告を呼び出すのは不適切でしょう。 ブラウザー拡張や WebDriver 等により実行されたスクリプトのエラーも好ましくないと思われます。 しかし、それらがコールバックなどを登録し、それが通常の方法 (イベントの dispatch など) により実行されるのであれば、そのエラーについては著者によるスクリプトのエラー同様にエラーの報告が行われることになります。
[16] スクリプトに関して例外を報告する場合、 例外例外について、次のようにしなければなりません >>61。
[178] 例外の報告は、次の場面で行われることがあります。EnqueueJob
(Promise
コールバック)addEventListener
)requestAnimationFrame
)requestPermission
コールバック >>146
[157] エラーは、まず error
イベントによって著者のスクリプトに報告が試みられます。
その処理がエラーの報告です。
[12] エラーを報告 >>13 する処理は、次の引数を受け取ります。
ErrorEvent
に設定します。ErrorEvent
[40] 本手順を終えるとエラーは取り扱われたか取り扱われなかったかのいずれかとなります。
[42] このエラーの報告で対象となるオブジェクトは、大域オブジェクトです。 言い換えると大域オブジェクトはエラーを報告するイベントの対象オブジェクトとなります。 エラーを報告するイベントにより他のスクリプトが起動されることがあるので、 対象はエラー報告モードフラグを持っています。 エラーの報告によるイベントの発火はエラー報告モード中には行われません。
[44] ErrorEvent
には filename
、lineno
、
colno
という属性があり、エラーが発生した元の位置の URL、
行番号、列番号を表しています。
[45] HTML Standard は動的に作られた (document.write
などによる)
スクリプトであっても、また複数行にわたるイベントハンドラーなどであっても、
利用者エージェントががんばって位置を特定することをすすめています >>13。
しかしその具体的な方法は規定されておらず、実装の品質の問題であると考えられます。
[46] 異なる起源の資源をスクリプトとして (script
src
などにより) 実行させることができますが、本来スクリプトではない資源を実行させ、
エラーメッセージなどからその資源の内容の一部または全部を取得したり、
推測したりすることができてしまうと異なる起源の情報の流出源となってしまうため、
同一起源方針によってエラーの報告は制限されています。
[47] スクリプトのエラーミュートフラグ >>48
が設定されていると、 ErrorEvent
によってエラーが発生した事実は伝えられますが、その内容や位置にはアクセスできなくなります (>>21)。
[50] エラーミュートフラグは、スクリプトの作成手順を呼び出す際に指定されていれば設定されます >>49。
これは次の場合に設定されます。script
要素の execute a script block 手順によってスクリプトが作成される場合で、
スクリプトが fetch により得られた場合で、 CORS-cross-origin である場合 >>51importScripts
によってスクリプトが作成される場合で、
スクリプトが現職設定群オブジェクトと同一起源でない起源を持つ URL の資源から来た場合
>>55
ErrorEvent
インターフェイス (DOM)[65] ErrorEvent
インターフェイスは Event
インターフェイスを継承したインターフェイスです。 >>64
[66] 他の Event
と同様に、 ErrorEvent
構築子を使って実現値を得ることができます。引数としてはイベント型と、
省略可能で辞書 (EventInit
を継承した
ErrorEventInit
) によって各種オプションを指定できます。 >>64
[67] ErrorEvent
は文書環境とワーカー環境の両方に晒されています >>64。
[68] ErrorEvent
は Event
のメンバーに加えて次のメンバーを持ちます。
いずれも初期値は空文字列、0、null のいずれか適切なものです >>64。
[74] 利用者エージェントによってdispatchされるイベントに関しては、これらの値は >>20, >>79 のようにして決定されます。
[177] filename
IDL属性の値は通常 URL となります。
元の URL に素片識別子が含まれていれば、そのままここに現れます >>171。
但し異なる起源のエラーの時は、空文字列になります。
onerror
属性 (DOM)[99] GlobalEventHandlers
インターフェイス >>91
と WorkerGlobalScope
インターフェイス >>90 の onerror
は、
error
イベントに対応するイベントハンドラーIDL属性です。
IDL属性の型は OnErrorEventHandler
です。
[98] OnErrorEventHandler
>>92 は、 EventHandler
とほぼ同じコールバック型ですが、引数として通常のイベントハンドラーのような
Event
1つに加えて、 >>94 の場合も扱えるようになっています。
[101] HTML要素の onerror
属性は、
error
イベントに対応するイベントハンドラー内容属性です >>91。
[103] error
イベントはエラーを報告するためのものと、
HTML要素などで用いられる通常のDOMイベントとしてのものの2種類があります。
onerror
はそのどちらにも対応するイベントハンドラーであり、
>>98 の通り両方の形に対応していますし、次に示すように挙動も変わります。
[94] イベントハンドラー処理アルゴリズムはイベントが ErrorEvent
でイベントハンドラーIDL属性が OnErrorEventHandler
として定義されている場合に、
コールバックの呼び出し時の引数を次のようにします。 >>93
[96] イベントハンドラー処理アルゴリズムはイベントが ErrorEvent
でイベント型が error
の時に、コールバックが返した値が
WebIDL boolean の真の値なら、イベントをキャンセルします。 >>93
[104] get the current value of the event handler は body
要素や
frameset
要素の onerror
内容属性の値を解釈するにあたり、
event
, source
, lineno
,
colno
, error
の5つの引数が順に与えられてるものとします。
>>106
[129] onerror
は JavaScript 1.1 で Window
,
Image
, img
要素に追加されました >>128。
[132] この当時の定義では、初期値が undefined
で、値を null
にするとエラーを利用者に報告しない、となっていました。
<IMG NAME="imageBad1" SRC="corrupt.gif" ALIGN="left" BORDER="2" onError="null">... によって画像のエラーの表示を抑制できるとあります。現在の仕様や実装だとエラーは直接利用者には提示されませんし、 このように null を書いたところで抑制(?)できません。
[135] また img
のエラーの通知を (個々の img
に指定せずとも)
window.onerror = null
によって無効化できたようです >>128。
[11] ryuzi_kambe の?D - onError="this.src=altimage"; ( 版) <http://d.hatena.ne.jp/ryuzi_kambe/20070221/p3>
[1] 第五章 クライアントサイドの技術:エラー処理 (try...catch) ( 版) <http://www.openspc2.org/JavaScript/Ajax/Ajax_study/chapter05/015/index.html>
このスクリプトが期待通り動作するのはInternet ExplorerとFirefoxのみです。Safari 2やOperaではwindow.onerrorの処理は無視されエラーが発生してしまいます。また、エラーメッセージやエラー行数に関しても Internet ExplorerとFirefoxでは内容が異なります(行数もカウント位置が違うため互換性がない)。
[2] JavaScript掲示板 ( 版) <http://otd8.jbbs.livedoor.jp/javascript/bbs_plain?base=14946&range=1>
ただし、Opera(私のは最新より1つバージョン古い)はwindow.onerrorをハンドリングできませんでした。
ボクが使っているOperaは8.5ですが、ハンドリングできました(^_^;A
私の環境では、onerrorからcallerをたどれるのはIEだけでした。
スタックトレースの取得は(以前かぱさんがしていたように)Exceptionコンストラクタの中でして、onerrorはそれがなかったとき補助的にした方がNetscape等もサポートできるはずです。
う~ん。私の環境(Mozilla1.7.12、Firefox1.5、Opera8.5、IE6.0、NN7.1)ではすべて取得できましたよ。 ただしOperaに関してだけは、エラーメッセージ中にスタックトレース情報が含まれていました。 また、NN(Mozilla系?)では、onerrorハンドラの第4引数に謎のスタックトレース情報が入ってきました! (今はそれを使わずに自分でcallerを使って取り直していますが…)
[3] うちの Opera 9.61 でも window.onerror は効かないみたいですが。
[6] 機密情報を含むJSONには X-Content-Type-Options: nosniff をつけるべき - 葉っぱ日記 ( ( 版)) <http://d.hatena.ne.jp/hasegawayosuke/20130517/p1>
[114] Web Applications 1.0 (現在の HTML Standard) によって初めてエラーの報告の仕組みが詳細に記述されました。
[125] 最初に追加されたのは2004年8月28日のようです。 JavaScript 1.3 のドキュメントをもとにしていて >>124、現在に比べるとまだ単純な定義しかありませんでした。
onerror
の定義を含む最古のものです。 (当時はまだ svn で管理されていませんでした。)[123] >>115 によって初期値が undefined
で null
によってエラーを抑制できるという伝統的な定義から、初期値が null
で特に意味を持たない現在の定義に改められました。 >>126 によると当時の実装状況に追随したようです。
[111] JavaScript 1.1 以来、なぜか URL と行番号しかありませんでしたが、 2012年に列番号が追加されました。
[113] 2013年にはエラーの報告も特別な仕組みとしてではなく、DOMイベントの特別な場合として発送される形に変更されました。
[150] CVE-2015-1729(fixed by MS15-065) - masa’s memo ( 版) <http://d.hatena.ne.jp/masa141421356/20150914/1442239071>
[168] Rewrite script execution on top of ES · whatwg/html@4891d18 ( 版) <https://github.com/whatwg/html/commit/4891d18aaf2df1d40aa61f467a5a10cfc19dd85d>
[169] Report errors to developer consoles, not users · whatwg/html@a6d04ea ( 版) <https://github.com/whatwg/html/commit/a6d04ea7652f5ad1b61e4ab95de490f51511bffe>
[172] Note that error events get canceled by returning true · whatwg/html@dcfc9bb ( 版) <https://github.com/whatwg/html/commit/dcfc9bb6f9d2a1018f0d55fea758c736bd28232e>
[173] 17713 – Exceptions thrown from event handlers should not be propagated ( 版) <https://www.w3.org/Bugs/Public/show_bug.cgi?id=17713>
[174] Editorial: define Event attribute defaults through IDL · whatwg/html@0be0229 ( 版) <https://github.com/whatwg/html/commit/0be02299f128cbb7c65a7ce259fdd838fd44a4b5>
[175] Clarify settings object, realm, and global relationships · whatwg/html@0866f1b ( 版) <https://github.com/whatwg/html/commit/0866f1b3f4b4ea5a99a30909e9bbe557dea0b460>
[176] Fix #301: detail how javascript: return values become response bodies by domenic · Pull Request #1107 · whatwg/html ( 版) <https://github.com/whatwg/html/pull/1107>
[139] Merge pull request #113 from domenic/modernize-invoke ( (bzbarsky著, )) <https://github.com/heycam/webidl/commit/09c011d8de1077fe5991ceded97838650e376f6c>
[159] Use USVString for all URLs ( (domenic著, )) <https://github.com/whatwg/html/commit/018b983b77b2cd908f6d00100e7e0abe893dd2c3>
[167] Change IDL for OnErrorEventHandlerNonNull from column to colno ( (zcorpan著, )) <https://github.com/whatwg/html/commit/4820c3cad60e8e55176b27d1e7249fc59ee9b22c>
[170] An exception is not always an object (e.g., throw 7) (annevk著, ) <https://github.com/whatwg/html/commit/6f32dc2cdbde1991dfa8ba2bf79a2eebe18324cd>
[171] Invoke the URL serializer for ErrorEvent.filename (zcorpan著, ) <https://github.com/whatwg/html/commit/2c8eef6d8901be84f41093a6f6758362cb413696>
[179] Clarify "report an exception" · Issue #958 · whatwg/html () <https://github.com/whatwg/html/issues/958>
[180] Fix event handler processing algorithm special cases (domenic著, ) <https://github.com/whatwg/html/commit/c065e991b65e10a1fc77ba77fed9f0822ff6858b>
[181] "Script error." message in window.onerror makes bad DevExp trade off · Issue #2440 · whatwg/html () <https://github.com/whatwg/html/issues/2440>
[183] Fix error cases of <script type=module> (domenic著, ) <https://github.com/whatwg/html/commit/115763124a641e8814665c5014d28155f95ff441>
[184] Remove more types from document.createEvent() (ayg著, ) <https://github.com/whatwg/dom/commit/5a532da58455e55b1e611161b72224d083fee7d4>