* 仕様書 [REFS[ - [13] '''[CITE@en-US-x-hixie[HTML Standard]] ([TIME[2014-04-03 03:44:44 +09:00]] 版) ''' - [48] [CITE@en-US-x-hixie[HTML Standard]] ([TIME[2014-04-03 03:44:44 +09:00]] 版) - [49] [CITE@en-US-x-hixie[HTML Standard]] ([TIME[2014-04-03 03:44:44 +09:00]] 版) - [51] [CITE@en-US-x-hixie[HTML Standard]] ([TIME[2014-04-03 03:44:44 +09:00]] 版) - [55] [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]]]] が再帰的に呼ばれることはなく、 ([[利用者エージェント]]が[[利用者]]に[[エラー]]を報告するなら) 必ず[[利用者]]に報告されることになります。 * エラーの位置 [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]]。 しかしその具体的な方法は規定されておらず、[[実装の品質]]の問題であると考えられます。 * エラーの起源 [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]]。 これは次の場合に設定されます。 - [52] [[HTML]] [CODE(HTMLe)@en[[[script]]]] [[要素]]の [[execute a script block]] 手順によって[[スクリプトが作成]]される場合で、 [[スクリプト]]が [[fetch]] により得られた場合で、 [[CORS-cross-origin]] である場合 [SRC[>>51]] - [53] [CODE(DOMm)@en[[[importScripts]]]] によって[[スクリプトが作成]]される場合で、 [[スクリプト]]が[[現職設定群オブジェクト]]と[[同一起源]]でない[[起源]]を持つ [[URL]] の[[資源]]から来た場合 [SRC[>>55]] ;; [54] つまり [CODE(HTMLe)@en[[[script]]]] [[要素]]では [[CORS]] によって[[同一起源ポリシー]]を緩和できます。 * 歴史 [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