* 仕様書
[REFS[
- [13] [CITE@en-US-x-hixie[HTML Standard]] ([TIME[2014-04-03 03:44:44 +09:00]] 版)
]REFS]
* エラーの報告
[12] [[スクリプト]]について[DFN[[RUBYB[[[エラーを報告]]]@en[report the error]]]]するとは、
次の手順をいいます [SRC[>>13]]。
[FIG[
= [14] エラーの[[対象]]が[[誤り報告モード]]なら、エラーは[[取り扱われなかった]]とし、終わります。
= [15] エラーの[[対象]]を[[誤り報告モード]]とします。
= [20] [CODE(DOMi)@en[[[ErrorEvent]]]] を用意します。
-- [26] [[trusted]] とします。
-- [27] [[bubble]] しないとします。
-- [28] [[キャンセル可能]]とします。
-- [29] [[イベント名]]は [CODE(DOMe)@en[[[error]]]] とします。
-- [21] [[スクリプト]]の[[エラーミュートフラグ]]があれば、
--- [31] [CODE(DOMa)@en[[[filename]]]] は[[空文字列]]とします。
--- [23] [CODE(DOMa)@en[[[lineno]]]] は [CODE[[[0]]]] とします。
--- [24] [CODE(DOMa)@en[[[colno]]]] は [CODE[[[0]]]] とします。
--- [22] [CODE(DOMa)@en[[[message]]]] は [DFN[[CODE[[[Script error.]]]]]] とします。
--- [25] [CODE(DOMa)@en[[[error]]]] は [[null]] とします。
-- [30] そうでなければ、
--- [32] [CODE(DOMa)@en[[[filename]]]] は[[スクリプト]]を得た元の[[資源]]の[[絶対URL]]とします。
--- [34] [CODE(DOMa)@en[[[lineno]]]] はエラーの位置として指定された[[行番号]]とします。
--- [33] [CODE(DOMa)@en[[[colno]]]] はエラーの位置として指定された[[列番号]]とします。
--- [36] [CODE(DOMa)@en[[[message]]]] はエラーを説明する[[利用者エージェント]]定義の文字列とします。
--- [35] [CODE(DOMa)@en[[[error]]]] はエラーを表す[[オブジェクト]]を用意します。
---- [17] [[catch]] されていない[[例外]]の場合は、投げられた[[オブジェクト]]です。
---- [18] [[JavaScript]] エラーの場合は、 [CODE(JS)@en[[[Error]]]] [[オブジェクト]]です。
---- [19] 該当するものがなければ、 [[null]] とします。
= [37] >>20 の[[イベント]]を[[対象]]において [[dispatch]] します。
= [38] [[対象]]における[[誤り報告モード]]を終えます。
= [39] >>20 の[[イベント]]が[[キャンセル]]されていれば、エラーは[[取り扱われた]]とします。
そうでなければ、エラーは[[取り扱われなかった]]とします。
;; [40] 本手順を終えると[[エラー]]は[DFN[[RUBYB[[[取り扱われた]]]@en[handled]]]]か[DFN[[RUBYB[[[取り扱われなかった]]]@en[not handled]]]]かのいずれかとなります。
]FIG]
;; [41] ここで[[エラー]]が[[取り扱われなかった]]場合、呼び出し元である[[スクリプトの作成]]手順から[[利用者]]に[[エラー]]が報告されます。
[42] この[[エラーの報告]]で[[対象]]となる[[オブジェクト]]は、[[大域オブジェクト]]です。
言い換えると[[大域オブジェクト]]は[[エラー]]を報告する[[イベント]]の[[対象]]オブジェクトとなります。
[[エラー]]を報告する[[イベント]]により[[スクリプト]]が起動されることがあるので、
[[対象]]は[DFN[[RUBYB[[[エラー報告モード]]]@en[in error reporting mode]]]]フラグを持っています。
[[エラーの報告]]は[[エラー報告モード]]内では行われません。
;; [43] つまり [CODE(DOMa)@en[[[onerror]]]] 中の[[エラー]]によって [CODE(DOMa)@en[[[onerror]]]]
が再帰的に呼ばれることはなく、 ([[利用者エージェント]]が[[利用者]]に[[エラー]]を報告するなら)
必ず[[利用者]]に報告されることになります。
* 歴史
[11] [CITE[ryuzi_kambe の?D - onError="this.src=altimage";]] ([TIME[2007-06-08 01:22:17 +09:00]] 版)
[1] [CITE@ja[第五章 クライアントサイドの技術:エラー処理 (try...catch)]] ([TIME[2008-12-01 09:28:12 +09:00]] 版)
>
このスクリプトが期待通り動作するのはInternet ExplorerとFirefoxのみです。Safari 2やOperaではwindow.onerrorの処理は無視されエラーが発生してしまいます。また、エラーメッセージやエラー行数に関しても Internet ExplorerとFirefoxでは内容が異なります(行数もカウント位置が違うため互換性がない)。
[2] [CITE[JavaScript掲示板]] ([TIME[2008-12-01 09:29:06 +09:00]] 版)
>> ただし、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 は効かないみたいですが。
[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]] 版))
[5] [CITE[''''''[''''''whatwg'''''']'''''' Spec for handling runtime script errors doesn't seem to match reality]]
( ([TIME[2013-01-08 04:45:11 +09:00]] 版))
[6] [CITE[機密情報を含むJSONには X-Content-Type-Options: nosniff をつけるべき - 葉っぱ日記]]
( ([TIME[2013-05-17 04:25:50 +09:00]] 版))
[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]] 版))
[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]] 版))
[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]] 版))
[10] [CITE@en[Web Applications 1.0 r8239 Drop the ability to catch 'error' events from