[107] [[Web]] において[[スクリプト]]の[[エラー]]は、 [DFN[[CODE(DOMe)@en[[[error]]]]]]
[[イベント]]として通知されます。この[[イベント]]が所定の手順で処理されない場合、
[[利用者]]に通知されます。

* 仕様書

[REFS[
- [13] '''[CITE@en-US-x-hixie[HTML Standard]] ([TIME[2014-04-03 03:44:44 +09:00]] 版) <http://www.whatwg.org/specs/web-apps/current-work/#report-the-error>'''
- [48] [CITE@en-US-x-hixie[HTML Standard]] ([TIME[2014-04-03 03:44:44 +09:00]] 版) <http://www.whatwg.org/specs/web-apps/current-work/#muted-errors>
- [49] [CITE@en-US-x-hixie[HTML Standard]] ([TIME[2014-04-03 03:44:44 +09:00]] 版) <http://www.whatwg.org/specs/web-apps/current-work/#create-a-script>
- [51] [CITE@en-US-x-hixie[HTML Standard]] ([TIME[2014-04-03 03:44:44 +09:00]] 版) <http://www.whatwg.org/specs/web-apps/current-work/#execute-the-script-block>
- [55] [CITE@en-US-x-hixie[HTML Standard]] ([TIME[2014-04-03 03:44:44 +09:00]] 版) <http://www.whatwg.org/specs/web-apps/current-work/#dom-workerglobalscope-importscripts>
- [61] [CITE@en-US-x-hixie[HTML Standard]] ([TIME[2014-04-03 03:44:44 +09:00]] 版) <http://www.whatwg.org/specs/web-apps/current-work/#runtime-script-errors-in-documents>
- [64] [CITE@en-US-x-hixie[HTML Standard]] ([TIME[2014-04-03 03:44:44 +09:00]] 版) <http://www.whatwg.org/specs/web-apps/current-work/#errorevent>
- [75] [CITE@en-US-x-hixie[HTML Standard]] ([TIME[2014-04-03 03:44:44 +09:00]] 版) <http://www.whatwg.org/specs/web-apps/current-work/#runtime-script-errors-0>
- [93] [CITE@en-US-x-hixie[HTML Standard]] ([TIME[2014-04-03 03:44:44 +09:00]] 版) <http://www.whatwg.org/specs/web-apps/current-work/#the-event-handler-processing-algorithm>
- [91] [CITE@en-US-x-hixie[HTML Standard]] ([TIME[2014-04-03 03:44:44 +09:00]] 版) <http://www.whatwg.org/specs/web-apps/current-work/#handler-onerror>
- [90] [CITE@en-US-x-hixie[HTML Standard]] ([TIME[2014-04-03 03:44:44 +09:00]] 版) <http://www.whatwg.org/specs/web-apps/current-work/#handler-workerglobalscope-onerror>
- [92] [CITE@en-US-x-hixie[HTML Standard]] ([TIME[2014-04-03 03:44:44 +09:00]] 版) <http://www.whatwg.org/specs/web-apps/current-work/#onerroreventhandler>
- [106] [CITE@en-US-x-hixie[HTML Standard]] ([TIME[2014-04-03 03:44:44 +09:00]] 版) <http://www.whatwg.org/specs/web-apps/current-work/#getting-the-current-value-of-the-event-handler>
- [140] [CITE@en-GB-x-hixie[HTML Standard]] ([TIME[2014-11-22 09:02:55 +09:00]] 版) <https://html.spec.whatwg.org/#run-the-animation-frame-callbacks>
- [142] [CITE@en-US[DOM Standard]] ([TIME[2014-11-27 19:54:36 +09:00]] 版) <https://dom.spec.whatwg.org/#concept-event-listener-invoke>
- [143] [CITE@en-US[DOM Standard]] ([TIME[2014-11-27 19:54:36 +09:00]] 版) <https://dom.spec.whatwg.org/#notify-mutation-observers>
- [146] [CITE@en-US[Notifications API Standard]] ([TIME[2014-11-26 20:41:09 +09:00]] 版) <https://notifications.spec.whatwg.org/#dom-notification-requestpermission>
]REFS]

* エラーの処理

[108] [[スクリプト]]の構文解析の失敗や[[スクリプト]]内で[[例外]]が投げられてそれが [[catch]]
されない場合など、[[スクリプト]]の処理中に検出され[[スクリプト]]内で直接処理されなかった失敗が本項でいう[[エラー]]です。

[109] [[エラー]]はまず[[エラーの報告]]手順に引き渡されて、
[[エラー]]を処理するために事前に登録された[[スクリプト]]によって扱おうとします。

[110] そのような[[スクリプト]]が存在しない場合や、処理できないとされる場合、
エラー処理中にエラーが発生した場合には、このエラーを[[利用者]]に報告することができます。

;; [141] この2つのステップをまとめたものが「[[例外を報告]]」です。
(「[[エラーを報告]]」と紛らわしいので注意。) しかし次に示す通り「[[例外を報告]]」
を呼び出さずに「[[エラーを報告]]」が直接呼び出される場合もあります。

[57] 仕様書上の手順としてエラーがどのように処理されるかは、
エラーが静的 ([[構文解析]]、[[コンパイル]]等で検出されるエラー)
か動的 (実行時エラー、 [[catch]] されない[[例外]]など)
か、[[スクリプト]]が仕様書上どのように定義されているかによって異なります。

;; エラーがまず[[イベント]]として報告され、
そこで取り扱われなかったら[[利用者]] ([[開発者コンソール]]) に報告する、
という流れは共通ですが、細部が異なります。

[59] [[イベントハンドラー]]の静的エラーについては、
[[get the current value of the event handler]] 手順から[[エラーの報告]]手順が呼び出されます。
([[イベントハンドラー]]の項を参照。)

;; [41] [[エラー]]が[[取り扱われなかった]]場合、呼び出し元である >>58, >>59 
から[[利用者]]に[[エラー]]を報告して[['''構わない''']]とされています。

[76] [[ワーカー]]のスクリプトで [[catch]] されていないエラーが発生した時は、
[CODE(DOMi)@en[[[WorkerGlobalScope]]]] を[[対象]]として[[エラーを報告]]しなければ[['''なりません''']]。
それによって[[エラー]]が[[取り扱われなかった]]場合は、次のようにします。 [SRC[>>75]]
[FIG(switch)[
:[77] [[共有ワーカー]]の場合:
[[開発者コンソール]]に報告して[['''構いません''']]。 [SRC[>>76]]
:[78] [[専用ワーカー]]の場合:
次のような[[タスク]]を[[タスクキューに追加]]します。
[FIG(list members)[
[FIGCAPTION[
[[タスク]]
]FIGCAPTION]
:[F[[[タスク源]]]]: [[DOM操作タスク源]]
:処理:
[FIG(steps)[
= [79] [[ワーカー]]に関連付けられた [CODE(DOMi)@en[[[Worker]]]] [[オブジェクト]]において
[CODE(DOMi)@en[[[ErrorEvent]]]] を[[発火]]します。
-- [80] [[trusted]] とします。
-- [81] [[イベント型]]は [CODE(DOMe)@en[[[error]]]] とします。
-- [82] [[bubble]] しません。
-- [83] [[キャンセル可能]]とします。
-- [84] [CODE(DOMa)@en[[[message]]]], [CODE(DOMa)@en[[[filename]]]], [CODE(DOMa)@en[[[lineno]]]],
[CODE(DOMa)@en[[[colno]]]] は適当に設定します。
-- [85] [CODE(DOMa)@en[[[error]]]] は [[null]] とします。
= [86] >>79 で[[キャンセル]]されなければ、 [CODE(DOMi)@en[[[Worker]]]] の[[大域スコープ]]において [[catch]]
されていない実行時エラーが発生したこととします。
]FIG]
- [87] [[ワーカー]]から [CODE(DOMi)@en[[[Worker]]]] への接続が解かれている場合
(親[[ワーカー]]が終端されている場合) には、 [CODE(DOMa)@en[[[event]]]] [[イベントハンドラー]]はなく、
[CODE(DOMa)@en[[[onerror]]]] は [[null]] であるとみなします。
]FIG]
]FIG]

;; [88] 従って[[専用ワーカー]]でのエラーは処理されなければ作成元をたどって結局最初の[[閲覧文脈]]に到達し、
そこから[[利用者]]へと通知されることになります。経路途中の[[ワーカー]]が破棄されている場合は >>87
によりスキップされます。

;; [89] >>84 は適当な値がどのようなものか明確になっていませんが、元の [CODE(DOMi)@en[[[ErrorEvent]]]]
と同じ値でいいのでしょうか。 (たとえ[[起源]]が違っていたとしても、 [CODE(DOMm)@en[[[postMessage]]]]
によって通信できる[[ワーカー]]からの情報なので、[[起源]]を超えた情報の漏洩には当たらないはずです。

[148] [[開発者ツール]]の[[コンソール]]から実行した[[スクリプト]]のエラーについて[[エラーの報告]]を呼び出すのは不適切でしょう。
[[ブラウザー拡張]]や [[WebDriver]] 等により実行された[[スクリプト]]のエラーも好ましくないと思われます。
しかし、それらが[[コールバック]]などを登録し、それが通常の方法 ([[イベント]]の [[dispatch]]
など) により実行されるのであれば、そのエラーについては[[著者]]による[[スクリプト]]のエラー同様に[[エラーの報告]]が行われることになります。

;; [149] ですから、[[著者]]はまったく想定しないエラーの報告を受ける可能性があります。

[HISTORY[
[58] かつては、[[スクリプトの作成]]手順によって作られる[[スクリプト]] (ほとんどの[[スクリプト]])
の静的エラーについては、
[[スクリプトの作成]]手順から[[エラーの報告]]手順が呼び出されていました。
現在はそこから呼び出される[[コード入口点に飛ぶ]]手順から[[例外の報告]]が呼び出されています。

[62] [CODE(DOMi)@en[[[Document]]]] と関連付けられた[[スクリプト]]で[[捕捉]]されていない実行時エラーが発生した時は、
[[例外を報告]]しなければ[['''なりません''']] [SRC[>>61]]。

;; [63] [CODE(DOMi)@en[[[Document]]]] と関連付けられた[[スクリプト]]というのが曖昧ですが、
[[ワーカー]]ではなく[[閲覧文脈]]内で実行されている[[スクリプト]]のことを指していると思われます。
しかし >>58 や >>59 で [[HTML]] 中で実行される[[スクリプト]]はカバーされています。
この規定はそれ以外の[[イベントリスナー]]や [[SVG]] の[[スクリプト]]などが対象なのでしょうか。
]HISTORY]

* 例外の報告

[16] [VAR[スクリプト]]に関して[DFN[[RUBYB[[[例外を報告]]]@en[report the exception]]]]する場合、
[[例外]][VAR[例外]]について、次のようにしなければ[['''なりません''']] [SRC[>>61]]。

[FIG(steps)[
= [162] [VAR[スクリプト]]を、関係する[[スクリプト]]に設定します。
= [165] [VAR[エラー]]を、[[例外]][VAR[例外]]に設定します。
= [161] [[エラーの報告]]をします。
[FIG(list members)[
:[VAR[スクリプト]]: [VAR[スクリプト]]
:[VAR[エラー]]: [VAR[エラー]]
:[VAR[行]]と[VAR[列]]: [VAR[スクリプト]]を含む[[資源]]における問題の位置
:[VAR[対象]]: [VAR[スクリプト]]の[F[[[設定群オブジェクト]]]]の[F[[[大域オブジェクト]]]]
]FIG]
= [163] [VAR[エラー]]が取り扱われなかった場合、
==
@@ [60] [[ワーカー]]の場合、 >>76 のようにします。
== [164] [VAR[エラー]]を[[開発者コンソール]]に報告して構いません。
]FIG]

;; [166] 関係する[[スクリプト]]や問題の位置の特定方法は明確ではありません。[[実装の品質]]の問題かもしれません。


[178] [[例外の報告]]は、次の場面で行われることがあります。
[FIG(middle list)[
- [[モジュールスクリプトの作成]]
- [[古典スクリプトの実行]] (旧[[コード入口点に飛ぶ]])
- [[モジュールスクリプトの子孫のfetch]]
- [[モジュールスクリプトの実行]]
- [[カスタム要素反応群の呼び出し]]
- [CODE(JS)@en[EnqueueJob]] ([CODE(JS)@en[Promise]] [[コールバック]])
- [[イベントリスナー]] [SRC[>>142]] ([CODE(DOMm)@en[[[addEventListener]]]])
- [[変異観察器]] [SRC[>>143]]
- [[アニメーションフレームコールバック]] [SRC[>>140]] ([CODE(DOMm)@en[[[requestAnimationFrame]]]])
- [CODE(DOMm)@en[[[requestPermission]]]] [[コールバック]] [SRC[>>146]]
- [[要素の作成]]
- [[アイドルコールバックタイムアウト群アルゴリズム]] ([[仕様書]]上は[[誤りを報告]])
- [[アイドルコールバックタイムアウト呼び出しアルゴリズム]] ([[仕様書]]上は[[誤りを報告]])

[HISTORY[
- [[字句の要素の作成]]
- [CODE(JS)@en[NextJob]]
]HISTORY]
]FIG]

* エラーの報告

[157] エラーは、まず [CODE(DOMe)@en[[[error]]]] [[イベント]]によって[[著者]]の[[スクリプト]]に報告が試みられます。
その処理が[[エラーの報告]]です。

[12] [DFN[[RUBYB[[[エラーを報告]]]@en[report the error]]]] [SRC[>>13]]
する処理は、次の[[引数]]を受け取ります。

[FIG(list members)[
:[VAR[[RUBYB[スクリプト]@en[script]]]]: [[スクリプト]]です。
:[VAR[エラー]]: 報告するべき何らかのエラーです。
:[VAR[[RUBYB[行]@en[line]]]]、[VAR[[RUBYB[列]@en[col]]]]: [VAR[エラー]]が発生した位置です。
:[VAR[[RUBYB[対象]@en[target]]]]: [VAR[エラー]]を報告する[[イベント]]の[[対象]]とする[[オブジェクト]]です。
[[大域オブジェクト]]が使われます。
]FIG]

[151] 次のようにしなければ[['''なりません''']] [SRC[>>13]]。

[FIG(steps)[
= [14] [VAR[対象]]が[F[[[誤り報告モード]]]]なら、
== [152] エラーは[[取り扱われなかった]]とし、終わります。
= [15] [VAR[対象]]を[F[[[誤り報告モード]]]]に設定します。
= [21] [VAR[スクリプト]]の[F[[[エラーミュートフラグ]]]]が設定されていれば、
== [20] [VAR[イベント]]を、新しい [CODE(DOMi)@en[[[ErrorEvent]]]] に設定します。
[FIG(list members middle)[
[FIGCAPTION[
[CODE(DOMi)@en[[[ErrorEvent]]]]
]FIGCAPTION]
:[26] [F[[[trusted]]]]: [[真]]
:[27] [F[[[bubble]]]]: [[偽]]
:[28] [F[[[取消可能]]]]: [[真]]
:[29] [F[[[イベント型]]]]: [CODE(DOMe)@en[[[error]]]]
:[31] [F[[CODE(DOMa)@en[[[filename]]]]]]: [[空文字列]]
:[23] [F[[CODE(DOMa)@en[[[lineno]]]]]]: [CODE[[[0]]]]
:[24] [F[[CODE(DOMa)@en[[[colno]]]]]]: [CODE[[[0]]]]
:[22] [F[[CODE(DOMa)@en[[[message]]]]]]: [DFN[[CODE[[[Script error.]]]]]]
:[25] [F[[CODE(DOMa)@en[[[error]]]]]]: [[null]]
]FIG]
= [30] そうでなければ、
== [17] [VAR[エラー]]が[[捕獲]]されなかった[[例外]]の場合、
=== [156] [VAR[エラーオブジェクト]]を、[VAR[エラー]]の[F[[[例外]]]]に設定します。
== [18] それ以外で、[VAR[エラー]]が [[JavaScript]] の[[エラー]]の場合、
=== [158] [VAR[エラーオブジェクト]]を、[VAR[エラー]]の 
[F[[CODE(JS)@en[[[Error]]]] [[オブジェクト]]]]に設定します。
== [19] それ以外なら、
=== [160] [VAR[エラーオブジェクト]]を、 [[null]] に設定します。
== [153] [VAR[イベント]]を、新しい [CODE(DOMi)@en[[[ErrorEvent]]]] に設定します。
[FIG(list members middle)[
[FIGCAPTION[
[CODE(DOMi)@en[[[ErrorEvent]]]]
]FIGCAPTION]
:[F[[[trusted]]]]: [[真]]
:[F[[[bubble]]]]: [[偽]]
:[F[[[取消可能]]]]: [[真]]
:[F[[[イベント型]]]]:  [CODE(DOMe)@en[[[error]]]]
:[32] [F[[CODE(DOMa)@en[[[filename]]]]]]: 
[VAR[スクリプト]]を得た元の[[資源]]の 
[[URL記録]]に
[[URL直列化器]]を適用した結果
:[34] [F[[CODE(DOMa)@en[[[lineno]]]]]]: [VAR[行]]
:[33] [F[[CODE(DOMa)@en[[[colno]]]]]]: [VAR[列]]
:[36] [F[[CODE(DOMa)@en[[[message]]]]]]: [VAR[エラー]]を説明する[[利用者エージェント]]定義の文字列
:[35] [F[[CODE(DOMa)@en[[[error]]]]]]: [VAR[エラーオブジェクト]]
]FIG]
= [37] [VAR[イベント]]を[VAR[対象]]において [[dispatch]] します。
= [38] [VAR[対象]]における[F[[[誤り報告モード]]]]を終えます。
= [39] [VAR[イベント]]が[F[[[取消]]]]されていれば、
== [154] [VAR[エラー]]は[[取り扱われた]]とします。
= [155] そうでなければ、
== [VAR[エラー]]は[[取り扱われなかった]]とします。
]FIG]

[40] 本手順を終えると[VAR[エラー]]は[DFN[[RUBYB[[[取り扱われた]]]@en[handled]]]]か[DFN[[RUBYB[[[取り扱われなかった]]]@en[not handled]]]]かのいずれかとなります。

;; この2状態は、[[約束の拒絶]]と同様のものです。

[42] この[[エラーの報告]]で[VAR[対象]]となる[[オブジェクト]]は、[[大域オブジェクト]]です。
言い換えると[[大域オブジェクト]]は[[エラー]]を報告する[[イベント]]の[F[[[対象]]]]オブジェクトとなります。
[[エラー]]を報告する[[イベント]]により他の[[スクリプト]]が起動されることがあるので、
[[対象]]は[F[[DFN[[RUBYB[[[エラー報告モード]]]@en[in error reporting mode]]]]フラグ]]を持っています。
[[エラーの報告]]による[[イベント]]の[[発火]]は[[エラー報告モード]]中には行われません。

;; [43] つまり [CODE(DOMa)@en[[[onerror]]]] 中の[[エラー]]によって [CODE(DOMa)@en[[[onerror]]]]
が[[再帰的]]に呼ばれることはなく、 ([[利用者エージェント]]が[[利用者]]に[[エラー]]を報告するなら)
必ず[[利用者]]に報告されることになります。

* エラーの位置

[44] [CODE(DOMi)@en[[[ErrorEvent]]]] には [CODE(DOMa)@en[[[filename]]]]、[CODE(DOMa)@en[[[lineno]]]]、
[CODE(DOMa)@en[[[colno]]]] という[[属性]]があり、エラーが発生した元の位置の [[URL]]、
[[行番号]]、[[列番号]]を表しています。

[45] [[HTML Standard]] は動的に作られた ([CODE(JS)@en[[[document.write]]]] などによる)
[[スクリプト]]であっても、また複数行にわたる[[イベントハンドラー]]などであっても、
[[利用者エージェント]]ががんばって位置を特定することをすすめています [SRC[>>13]]。
しかしその具体的な方法は規定されておらず、[[実装の品質]]の問題であると考えられます。

@@ [182] [[SourceMap]]

* エラーの起源

[46] 異なる[[起源]]の[[資源]]を[[スクリプト]]として ([CODE(HTMLe)@en[[[script]]]] [CODE(HTMLa)@en[[[src]]]]
などにより) 実行させることができますが、本来[[スクリプト]]ではない[[資源]]を実行させ、
エラーメッセージなどからその[[資源]]の内容の一部または全部を取得したり、
推測したりすることができてしまうと異なる[[起源]]の情報の流出源となってしまうため、
[[同一起源方針]]によってエラーの報告は制限されています。

[47] [[スクリプト]]の[DFN[[RUBYB[[[エラーミュート]]]@en[muted errors]]]]フラグ [SRC[>>48]]
が設定されていると、 [CODE(DOMi)@en[[[ErrorEvent]]]]
によって[[エラー]]が発生した事実は伝えられますが、その内容や位置にはアクセスできなくなります (>>21)。

[50] [[エラーミュートフラグ]]は、[[スクリプトの作成]]手順を呼び出す際に指定されていれば設定されます [SRC[>>49]]。
これは次の場合に設定されます。
[FIG[
- [52] [[HTML]] [CODE(HTMLe)@en[[[script]]]] [[要素]]の [[execute a script block]] 手順によって[[スクリプトが作成]]される場合で、
[[スクリプト]]が [[fetch]] により得られた場合で、 [[CORS-cross-origin]] である場合 [SRC[>>51]]
- [53] [CODE(DOMm)@en[[[importScripts]]]] によって[[スクリプトが作成]]される場合で、
[[スクリプト]]が[[現職設定群オブジェクト]]と[[同一起源]]でない[[起源]]を持つ [[URL]] の[[資源]]から来た場合
[SRC[>>55]]

;; [56] 仕様書が存在しませんが、 [[SVG]] [CODE(XMLe)@en[[[script]]]] [[要素]]でも同様と思われます。
]FIG]

;; [54] つまり [CODE(HTMLe)@en[[[script]]]] [[要素]]では [[CORS]] によって[[同一起源ポリシー]]を緩和できます。

* [CODE(DOMi)@en[ErrorEvent]] インターフェイス (DOM)

[65] [DFN[[CODE(DOMi)@en[[[ErrorEvent]]]]]] [[インターフェイス]]は [CODE(DOMi)@en[[[Event]]]]
[[インターフェイス]]を[[継承]]した[[インターフェイス]]です。 [SRC[>>64]]

[66] 他の [CODE(DOMi)@en[[[Event]]]] と同様に、 [CODE(DOMi)@en[[[ErrorEvent]]]]
[[構築子]]を使って[[実現値]]を得ることができます。[[引数]]としては[[イベント型]]と、
省略可能で[[辞書]] ([CODE(DOMi)@en[[[EventInit]]]] を継承した
[DFN[[CODE(DOMi)@en[[[ErrorEventInit]]]]]]) によって各種オプションを指定できます。 [SRC[>>64]]

[67] [CODE(DOMi)@en[[[ErrorEvent]]]] は[[文書環境]]と[[ワーカー環境]]の両方に[[晒されています]] [SRC[>>64]]。

** メンバー

[68] [CODE(DOMi)@en[[[ErrorEvent]]]] は [CODE(DOMi)@en[[[Event]]]] のメンバーに加えて次のメンバーを持ちます。
いずれも初期値は[[空文字列]]、[[0]]、[[null]] のいずれか適切なものです [SRC[>>64]]。
[FIG(list)[
- [72] [DFN[[CODE(DOMa)@en[[[colno]]]]]] ([CODE(DOMi)@en[[[unsigned long]]]])
- [73] [DFN[[CODE(DOMa)@en[[[error]]]]]] ([CODE(DOMi)@en[[[any]]]])
- [70] [DFN[[CODE(DOMa)@en[filename][ErrorEvent]]]] ([CODE(DOMi)@en[USVString]])
- [71] [DFN[[CODE(DOMa)@en[[[lineno]]]]]] ([CODE(DOMi)@en[[[unsigned long]]]])
- [69] [CODE(DOMa)@en[[[message]]]] ([CODE(DOMi)@en[[[DOMString]]]])
]FIG]

[74] [[利用者エージェント]]によって[[dispatch]]される[[イベント]]に関しては、これらの値は >>20, >>79
のようにして決定されます。

[177] [CODE[filename][ErrorEvent]] [[IDL属性]]の値は通常 [[URL]] となります。
元の [[URL]] に[[素片識別子]]が含まれていれば、そのままここに現れます [SRC[>>171]]。
但し[[異なる起源]]のエラーの時は、[[空文字列]]になります。

* [CODE(DOMa)@en[onerror]] 属性 (DOM)

[99] [CODE(DOMi)@en[[[GlobalEventHandlers]]]] [[インターフェイス]] [SRC[>>91]]
と [CODE(DOMi)@en[[[WorkerGlobalScope]]]] [[インターフェイス]] [SRC[>>90]] の [DFN[[CODE(DOMa)@en[[[onerror]]]]]] は、
[CODE(DOMe)@en[[[error]]]] [[イベント]]に対応する[[イベントハンドラーIDL属性]]です。
[[IDL属性]]の型は [CODE(DOMi)@en[[[OnErrorEventHandler]]]] です。

;; [100] [CODE(DOMi)@en[[[GlobalEventHandlers]]]] [[インターフェイス]]は [CODE(DOMi)@en[[[Window]]]],
[CODE(DOMi)@en[[[Document]]]], [CODE(DOMi)@en[[[HTMLElement]]]] が[[実装]]しています。

[98] [DFN[[CODE(DOMi)@en[[[OnErrorEventHandler]]]]]] [SRC[>>92]] は、 [CODE(DOMi)@en[[[EventHandler]]]]
とほぼ同じ[[コールバック]]型ですが、[[引数]]として通常の[[イベントハンドラー]]のような
[CODE(DOMi)@en[[[Event]]]] 1つに加えて、 >>94 の場合も扱えるようになっています。

[101] [[HTML要素]]の [DFN[[CODE(HTMLa)@en[[[onerror]]]]]] [[属性]]は、
[CODE(DOMe)@en[[[error]]]] [[イベント]]に対応する[[イベントハンドラー内容属性]]です [SRC[>>91]]。

;; [102] [CODE(HTMLe)@en[[[body]]]] [[要素]]と [CODE(HTMLe)@en[[[frameset]]]] [[要素]]では、
これらの[[イベントハンドラーIDL属性]]と[[イベントハンドラー内容属性]]は[[要素]]自身ではなく [CODE(DOMi)@en[[[Window]]]]
[[オブジェクト]]に対してのものとなります。

[103] [CODE(DOMe)@en[[[error]]]] [[イベント]]は[[エラーを報告]]するためのものと、
[[HTML要素]]などで用いられる通常の[[DOMイベント]]としてのものの2種類があります。
[CODE@en[[[onerror]]]] はそのどちらにも対応する[[イベントハンドラー]]であり、
>>98 の通り両方の形に対応していますし、次に示すように挙動も変わります。

[94] [[イベントハンドラー処理アルゴリズム]]は[[イベント]]が [CODE(DOMi)@en[[[ErrorEvent]]]]
で[[イベントハンドラーIDL属性]]が [CODE(DOMi)@en[[[OnErrorEventHandler]]]] として定義されている場合に、
[[コールバック]]の呼び出し時の[[引数]]を次のようにします。 [SRC[>>93]]
[FIG[
= [CODE(DOMa)@en[[[message]]]] [[属性値]]
= [CODE(DOMa)@en[[[filename]]]] [[属性値]]
= [CODE(DOMa)@en[[[lineno]]]] [[属性値]]
= [CODE(DOMa)@en[[[colno]]]] [[属性値]]
= [CODE(DOMa)@en[[[error]]]] [[属性値]]
]FIG]

;; [95] 他の場合には[[引数]]としては [CODE(DOMi)@en[[[Event]]]] だけが渡されますが、
この場合は [CODE(DOMi)@en[[[Event]]]] にはアクセスできません。

[96] [[イベントハンドラー処理アルゴリズム]]は[[イベント]]が [CODE(DOMi)@en[[[ErrorEvent]]]]
で[[イベント型]]が [CODE(DOMa)@en[[[error]]]] の時に、[[コールバック]]が返した値が
[[WebIDL]] [[boolean]] の[[真]]の値なら、[[イベント]]を[[キャンセル]]します。 [SRC[>>93]]

;; [97] 他の場合には逆に[[偽]]の値の時、[[キャンセル]]します。

[104] [[get the current value of the event handler]] は [CODE(HTMLe)@en[[[body]]]] [[要素]]や
[CODE(HTMLa)@en[[[frameset]]]] [[要素]]の [CODE(HTMLa)@en[[[onerror]]]]
[[内容属性]]の値を解釈するにあたり、
[CODE(DOMp)@en[[[event]]]], [CODE(DOMp)@en[[[source]]]], [CODE(DOMp)@en[[[lineno]]]], 
[CODE(DOMp)@en[[[colno]]]], [CODE(DOMp)@en[[[error]]]] の5つの[[引数]]が順に与えられてるものとします。
[SRC[>>106]]

;; [105] 他の場合には [CODE(DOMp)@en[[[event]]]] のみとなります。

* 歴史

** 誕生

[129] [CODE(DOMa)@en[[[onerror]]]] は [[JavaScript 1.1]] で [CODE(DOMi)@en[[[Window]]]],
[CODE(DOMi)@en[[[Image]]]], [CODE(HTMLe)@en[[[img]]]] [[要素]]に追加されました [SRC[>>128]]。

;; [130] この頃はまだ [CODE(JS)@en[[[try]]]] もありませんでしたから、[[エラー]]を回避する唯一の方法でした。

;; [131] [CODE(HTMLe)@en[[[body]]]] [[要素]]にはまだなかったようです。

[132] この当時の定義では、初期値が [CODE(JS)@en[[[undefined]]]] で、値を [CODE(JS)@en[[[null]]]]
にするとエラーを[[利用者]]に報告しない、となっていました。

;; [133] 当時の [[Netscape Navigator]] は [[JavaScript]] エラーを必ず新しい[[窓]]に表示する仕様でした。

[134] >>128 には
[PRE(HTML example code)[
<IMG NAME="imageBad1" SRC="corrupt.gif" ALIGN="left" BORDER="2"
   onError="null">
]PRE]
... によって画像のエラーの表示を抑制できるとあります。現在の仕様や実装だとエラーは直接[[利用者]]には提示されませんし、
このように [[null]] を書いたところで抑制(?)できません。

[135] また [CODE(HTMLe)@en[[[img]]]] のエラーの通知を (個々の [CODE(HTMLe)@en[[[img]]]] に指定せずとも) 
[CODE(JS)@en[[[window.onerror]] = [[null]]]] によって無効化できたようです [SRC[>>128]]。

[REFS[
- [128] [CITE[Event Handlers]] ([TIME[2014-04-15 17:01:20 +09:00]] 版) <http://web.archive.org/web/20040615233210/http://devedge.netscape.com/library/manuals/2000/javascript/1.3/reference/handlers.html#1120097>
]REFS]

** 標準不在の時代

[11] [CITE[ryuzi_kambe の?D - onError="this.src=altimage";]] ([TIME[2007-06-08 01:22:17 +09:00]] 版) <http://d.hatena.ne.jp/ryuzi_kambe/20070221/p3>

[1] [CITE@ja[第五章 クライアントサイドの技術:エラー処理 (try...catch)]] ([TIME[2008-12-01 09:28:12 +09:00]] 版) <http://www.openspc2.org/JavaScript/Ajax/Ajax_study/chapter05/015/index.html>

>
このスクリプトが期待通り動作するのはInternet ExplorerとFirefoxのみです。Safari 2やOperaではwindow.onerrorの処理は無視されエラーが発生してしまいます。また、エラーメッセージやエラー行数に関しても Internet ExplorerとFirefoxでは内容が異なります(行数もカウント位置が違うため互換性がない)。

[2] [CITE[JavaScript掲示板]] ([TIME[2008-12-01 09:29:06 +09:00]] 版) <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] [CITE[機密情報を含むJSONには X-Content-Type-Options: nosniff をつけるべき - 葉っぱ日記]]
( ([TIME[2013-05-17 04:25:50 +09:00]] 版))
<http://d.hatena.ne.jp/hasegawayosuke/20130517/p1>

** HTML5

[114] [[Web Applications 1.0]] (現在の [[HTML Standard]]) によって初めて[[エラーの報告]]の仕組みが詳細に記述されました。

[125] 最初に追加されたのは2004年8月28日のようです。 [[JavaScript 1.3]]
のドキュメントをもとにしていて [SRC[>>124]]、現在に比べるとまだ単純な定義しかありませんでした。

;; [122] >>121 の2004年9月23日付けが、[[Internet Archive]] に残っている [CODE(DOMa)@en[[[onerror]]]]
の定義を含む最古のものです。 (当時はまだ [[svn]] で管理されていませんでした。)

[REFS[
- [124] [CITE['''['''whatwg''']''' window.onerror]] ([TIME[2014-04-10 19:48:08 +09:00]] 版) <http://lists.whatwg.org/pipermail/whatwg-whatwg.org/2004-August/213847.html>
- [121] [CITE@en-GB-hixie[Web Applications 1.0]] ([TIME[2014-04-15 16:40:06 +09:00]] 版) <http://web.archive.org/web/20041009144718/http://www.whatwg.org/specs/web-apps/current-work/#onerror>
- [116] [CITE@en[Web Applications 1.0 r2550 Redefine onerror='' handling to be reusable from other specs.]] ([TIME[2008-12-24 05:33:00 +09:00]] 版) <http://html5.org/tools/web-apps-tracker?from=2549&to=2550>
- [120] [CITE@en[Web Applications 1.0 r2684 Bring the event handler attribute stuff in line with reality. Make onerror='' and .onerror make sense and compatible with legacy content.]] ([TIME[2009-01-21 18:09:00 +09:00]] 版) <http://html5.org/tools/web-apps-tracker?from=2683&to=2684>
- [118] [CITE@en[Web Applications 1.0 r2685     Define how the Window-magic event handler attributes like window.onload work. Tighten up the text around event handler attributes.]] ([TIME[2009-01-21 20:08:00 +09:00]] 版) <http://html5.org/tools/web-apps-tracker?from=2684&to=2685>
- [115] [CITE@en[Web Applications 1.0 r2807 Simplify window.onerror.]] ([TIME[2009-02-13 11:19:00 +09:00]] 版) <http://html5.org/tools/web-apps-tracker?from=2806&to=2807>
- [126] [CITE@en[Re: window.onerror initial value]] ([[Ian Hickson]] 著, [TIME[2009-02-13 11:19:52 +09:00]] 版) <http://lists.w3.org/Archives/Public/public-html/2009Feb/0292.html>
- [117] [CITE@en[Web Applications 1.0 r5828     report compile-time errors as well as runtime errors (and a typo fix from an earlier checkin)]] ([TIME[2011-02-04 06:33:00 +09:00]] 版) <http://html5.org/tools/web-apps-tracker?from=5827&to=5828>
- [119] [CITE@en[Web Applications 1.0 r6263     Make worker errors propagate all the way up to the Document, hitting the global scope .onerror each step of the way. This isn't a great way to specify it but I couldn't work out a cleaner way that didn't involve major (potentially risky) surgery and inventing new terms. If it turns out that there are other things that'd need the parent/child infrastructure to be better defined I'll do it then.]] ([TIME[2011-06-22 06:20:00 +09:00]] 版) <http://html5.org/tools/web-apps-tracker?from=6262&to=6263>
- [5] [CITE[''''''[''''''whatwg'''''']'''''' Spec for handling runtime script errors doesn't seem to match reality]]
( ([TIME[2013-01-08 04:45:11 +09:00]] 版))
<http://lists.whatwg.org/pipermail/whatwg-whatwg.org/2013-January/038524.html>
]REFS]

[123] >>115 によって初期値が [CODE(JS)@en[[[undefined]]]] で [CODE(JS)@en[[[null]]]]
によってエラーを抑制できるという伝統的な定義から、初期値が [CODE(JS)@en[[[null]]]]
で特に意味を持たない現在の定義に改められました。 >>126 によると当時の実装状況に追随したようです。

;; [127] >>125 の当時の実装状況がどうだったのか、気になります。

** エラーイベントの拡張

[111] [[JavaScript 1.1]] 以来、なぜか [[URL]] と[[行番号]]しかありませんでしたが、
2012年に[[列番号]]が追加されました。

[REFS[
- [4] [CITE@en[Web Applications 1.0 r6957     Try adding a fourth argument, 'column', to onerror handlers.Fixing https://www.w3.org/Bugs/Public/show_bug.cgi?id=13319]]
( ([TIME[2012-02-01 08:36:00 +09:00]] 版))
<http://html5.org/tools/web-apps-tracker?from=6956&to=6957>
- [7] [CITE@en[Web Applications 1.0 r8087     Rename 'ErrorEvent.column' to 'colno' to match IE.]]
( ([TIME[2013-07-26 08:42:00 +09:00]] 版))
<http://html5.org/tools/web-apps-tracker?from=8086&to=8087>
]REFS]

[112] 2013年には、[[エラー]]のオブジェクト自体にも[[エラーイベント]]からアクセスできるように拡張されました。

[REFS[
- [8] [CITE@en[Web Applications 1.0 r8086     New argument to onerror: the Error object itself.]]
( ([TIME[2013-07-25 03:50:00 +09:00]] 版))
<http://html5.org/tools/web-apps-tracker?from=8085&to=8086>
]REFS]

** DOM イベントとの統合

[113] 2013年には[[エラーの報告]]も特別な仕組みとしてではなく、[[DOMイベント]]の特別な場合として[[発送]]される形に変更されました。

[REFS[
- [9] [CITE@en[Web Applications 1.0 r7995     Revamp how errors are reported to be a little more sane and hopefully slightly closer to more browsers (but there's not a huge amount of interop here and so this won't exactly match anything). This is a very risky change so let me know if anything broke.]]
( ([TIME[2013-06-22 03:04:00 +09:00]] 版))
<http://html5.org/tools/web-apps-tracker?from=7994&to=7995>
]REFS]

** 2013年以降

[REFS[
- [10] [CITE@en[Web Applications 1.0 r8239     Drop the ability to catch 'error' events from <iframe>, since nobody implemented it after 5 years.]]
( ([TIME[2013-10-24 03:48:00 +09:00]] 版))
<http://html5.org/tools/web-apps-tracker?from=8238&to=8239>
- [136] [CITE@en[Bug 25522 – No need to special case onerror attribute event handler]]
( ([TIME[2014-06-06 11:51:34 +09:00]] 版))
<https://www.w3.org/Bugs/Public/show_bug.cgi?id=25522>
- [137] [CITE@en[Bug 26182 – Introduce a method that invokes this algorithm]]
( ([TIME[2014-06-26 13:24:13 +09:00]] 版))
<https://www.w3.org/Bugs/Public/show_bug.cgi?id=26182>
- [138] [CITE@en[Web Applications 1.0 r8849  Flesh out how rendering happens in the event loop. This also defines requestAnimationFrame() and obsoletes the 'Timing control for script-based animations' spec (by request of that spec's editors)]] ([TIME[2014-11-20 06:56:00 +09:00]] 版) <https://html5.org/r/8849>
- [144] [CITE@en[If an event listener callback throws, report the exception (window.onerr... · 55f7dbf · whatwg/dom]] ([TIME[2014-11-30 14:54:44 +09:00]] 版) <https://github.com/whatwg/dom/commit/55f7dbf200bfb63a26f66a3875dc6f9d402c7728>
- [147] [CITE@en[Exceptions thrown from mutation observer callbacks should be reported pe... · 2e567d3 · whatwg/dom]] ([TIME[2014-11-30 15:00:59 +09:00]] 版) <https://github.com/whatwg/dom/commit/2e567d3308724b29c9787bd069332775a3dbd8cc>
- [145] [CITE@en[Make sure any exceptions from requestPermission's callback are reported ... · 87f285e · whatwg/notifications]] ([TIME[2014-11-30 14:56:37 +09:00]] 版) <https://github.com/whatwg/notifications/commit/87f285ebd4bcc5fa423f1480a6bcbd16c70d6d98>
]REFS]

[150] [CITE[CVE-2015-1729(fixed by MS15-065) - masa’s memo]]
([TIME[2015-09-14 23:02:49 +09:00]] 版)
<http://d.hatena.ne.jp/masa141421356/20150914/1442239071>

[168] [CITE@en[Rewrite script execution on top of ES · whatwg/html@4891d18]]
([TIME[2015-12-22 23:54:49 +09:00]] 版)
<https://github.com/whatwg/html/commit/4891d18aaf2df1d40aa61f467a5a10cfc19dd85d>

[169] [CITE@en[Report errors to developer consoles, not users · whatwg/html@a6d04ea]]
([TIME[2015-12-25 11:48:36 +09:00]] 版)
<https://github.com/whatwg/html/commit/a6d04ea7652f5ad1b61e4ab95de490f51511bffe>

[172] [CITE@en[Note that error events get canceled by returning true · whatwg/html@dcfc9bb]]
([TIME[2016-02-24 13:47:40 +09:00]] 版)
<https://github.com/whatwg/html/commit/dcfc9bb6f9d2a1018f0d55fea758c736bd28232e>

[173] [CITE@en[17713 – Exceptions thrown from event handlers should not be propagated]]
([TIME[2016-03-15 12:04:17 +09:00]] 版)
<https://www.w3.org/Bugs/Public/show_bug.cgi?id=17713>

[174] [CITE@en[Editorial: define Event attribute defaults through IDL · whatwg/html@0be0229]]
([TIME[2016-03-23 21:15:59 +09:00]] 版)
<https://github.com/whatwg/html/commit/0be02299f128cbb7c65a7ce259fdd838fd44a4b5>

[175] [CITE@en[Clarify settings object, realm, and global relationships · whatwg/html@0866f1b]]
([TIME[2016-03-28 00:29:11 +09:00]] 版)
<https://github.com/whatwg/html/commit/0866f1b3f4b4ea5a99a30909e9bbe557dea0b460>

[176] [CITE@en[Fix #301: detail how javascript: return values become response bodies by domenic · Pull Request #1107 · whatwg/html]]
([TIME[2016-04-27 16:43:10 +09:00]] 版)
<https://github.com/whatwg/html/pull/1107>

[139] [CITE@en[Merge pull request #113 from domenic/modernize-invoke]]
( ([[bzbarsky]]著, [TIME[2016-05-21 05:55:00 +09:00]]))
<https://github.com/heycam/webidl/commit/09c011d8de1077fe5991ceded97838650e376f6c>

[159] [CITE@en[Use USVString for all URLs]]
( ([[domenic]]著, [TIME[2016-05-20 22:02:29 +09:00]]))
<https://github.com/whatwg/html/commit/018b983b77b2cd908f6d00100e7e0abe893dd2c3>

[167] [CITE@en[Change IDL for OnErrorEventHandlerNonNull from column to colno]]
( ([[zcorpan]]著, [TIME[2016-05-27 22:57:15 +09:00]]))
<https://github.com/whatwg/html/commit/4820c3cad60e8e55176b27d1e7249fc59ee9b22c>

[170] [CITE@en[An exception is not always an object (e.g., throw 7)]]
([[annevk]]著, [TIME[2016-08-30 04:09:45 +09:00]])
<https://github.com/whatwg/html/commit/6f32dc2cdbde1991dfa8ba2bf79a2eebe18324cd>

[171] [CITE@en[Invoke the URL serializer for ErrorEvent.filename]]
([[zcorpan]]著, [TIME[2016-11-22 21:37:45 +09:00]])
<https://github.com/whatwg/html/commit/2c8eef6d8901be84f41093a6f6758362cb413696>

[179] [CITE@en[Clarify "report an exception" · Issue #958 · whatwg/html]]
([TIME[2016-11-23 22:58:31 +09:00]])
<https://github.com/whatwg/html/issues/958>

[180] [CITE@en[Fix event handler processing algorithm special cases]]
([[domenic]]著, [TIME[2017-03-16 05:16:07 +09:00]])
<https://github.com/whatwg/html/commit/c065e991b65e10a1fc77ba77fed9f0822ff6858b>

[181] [CITE@en["Script error." message in window.onerror makes bad DevExp trade off · Issue #2440 · whatwg/html]]
([TIME[2017-03-17 16:14:43 +09:00]])
<https://github.com/whatwg/html/issues/2440>

[183] [CITE@en[Fix error cases of <script type=module>]]
([[domenic]]著, [TIME[2017-05-13 01:50:49 +09:00]])
<https://github.com/whatwg/html/commit/115763124a641e8814665c5014d28155f95ff441>

[184] [CITE@en[Remove more types from document.createEvent()]]
([[ayg]]著, [TIME[2017-08-06 21:41:25 +09:00]])
<https://github.com/whatwg/dom/commit/5a532da58455e55b1e611161b72224d083fee7d4>