[112] [DFN[[CODE(DOMi)@en[[[DOMException]]]]]] は、 [[DOM]] [[API]]
で用いられる[[例外]]です。

[113] [[DOM]] [[API]] は、 [[JavaScript]] 本体の [CODE(JS)@en[[[Error]]]] のいずれかか、
または [CODE(DOMi)@en[[[DOMException]]]] を[[例外]]として[[投げる]]ことがあります。

[HISTORY[
[114] かつて [[W3C DOM]] 時代には他の種類の[[例外]]も定義されていたことがありましたが、
既に[[廃止]]され、
両者に統合されました。
]HISTORY]

* 仕様書

[REFS[
- [20] '''[CITE[Web IDL (Second Edition)]] ([TIME[2015-05-27 01:29:33 +09:00]] 版) <http://heycam.github.io/webidl/#dfn-DOMException>'''
- [26] [CITE[Web IDL (Second Edition)]] ([TIME[2015-05-27 01:29:33 +09:00]] 版) <http://heycam.github.io/webidl/#idl-DOMException>
- [28] [CITE[Web IDL (Second Edition)]] ([TIME[2015-05-27 01:29:33 +09:00]] 版) <http://heycam.github.io/webidl/#es-DOMException>
- [34] [CITE[Web IDL (Second Edition)]] ([TIME[2015-05-27 01:29:33 +09:00]] 版) <http://heycam.github.io/webidl/#es-exceptions>
- [133] [CITE@en[Geolocation API Specification]], [TIME[2019-11-24 18:38:51 +09:00]] <https://w3c.github.io/geolocation-api/#position_error_interface>
]REFS]

* 意味

[25] [[Web IDLの型]] [CODE(IDL)@en[[[DOMException]]]] は、
[[例外]]のうち [CODE(IDL)@en[[[DOMException]]]] であるものを表します [SRC[>>20]]。

[27] [[型名]]は、 [CODE(IDL)@en[[[DOMException]]]] です [SRC[>>26]]。

* コンストラクター

[69] [CODE(DOMi)@en[DOMException]] [[コンストラクター]]は、
次のようにしなければ[MUST[なりません]] [SRC[>>34]]。

[FIG(steps)[
= [70] [VAR[メッセージ]]を、第1引数を [CODE[DOMString]] と解釈した結果に設定します。
[[既定値]]は[[空文字列]]とします。
= [72] [VAR[名前]]を、第2引数を [CODE[DOMString]] と解釈した結果に設定します。
[[既定値]]は [CODE[Error]] とします。
= [73] [VAR[例外]]を、新しい [CODE[DOMException]] に設定します。
[FIG(list members)[ [74] [CODE[DOMException]]
: [F[名前][エラー名]] : [VAR[名前]]
: [F[メッセージ][メッセージ (例外)]] : [VAR[メッセージ]]
]FIG]
= [75] [VAR[例外]]を返します。
]FIG]

* 状態

[66] [CODE[DOMException]] は、[[プラットフォームオブジェクト]]の状態に加えて、
次の状態を持ちます。

[FIG(list members)[
: [F[名前][エラー名]] : [[例外]]としての[[名前]] ([CODE[Error]] の [CODE[name][エラー名]]
に相当)。
: [F[メッセージ][メッセージ (例外)]] : [[例外]]の説明文 ([CODE[Error]] の
[CODE[message][メッセージ (例外)]] に相当)。
]FIG]

[68] [CODE(DOMi)@en[DOMException]] の[F[インターフェイスプロトタイプオブジェクト]]の
[F(ss)[Prototype]] は、 [CODE[%ErrorPrototype%]] でなければ[MUST[なりません]] [SRC[>>34]]。

* メンバー

[42] [CODE[DOMException]] [[インターフェイス]]には、
次の[[メンバー][インターフェイスメンバー]]があります。

[FIG(short list)[ [67] [CODE(DOMi)@en[DOMException]] の[[インターフェイスメンバー]]
- [CODE[name][エラー名]]
- [CODE[message][メッセージ (例外)]]
- [CODE(JS)@en[[[code]]]] (>>109)
- 各種[[定数]]
]FIG]

;; [45] [[DOMException]] はほとんど [[JavaScript]] [CODE(JS)@en[[[Error]]]]
と同じようであるよう定義されており、実装が非標準の[[特性]]を
[CODE(JS)@en[[[Error]]]] に追加する場合は、 [CODE[DOMException]]
にも[[晒す]][SHOULD[べき]]です。 [SRC[>>34]]

* [CODE(DOMa)@en[code]] 属性

[109] [CODE(DOMi)@en[[[DOMException]]]] には[[例外欄]] [DFN[[CODE(DOMa)@en[[[code]]]]]]
があります。[[データ型]]は [CODE(IDL)@en[[[unsigned short]]]] です [SRC[>>106]]。

[110] [[W3C DOM]] 時代から存在していたエラーには、[[エラー名]]に対応する
[CODE(DOMa)@en[[[code]]]] 値が定義されています [SRC[>>104]]。 [CODE(DOMi)@en[[[DOMException]]]]
が[[投げられた]]時、[[エラー名]]に対応する値があればそれが
[CODE(DOMa)@en[[[code]]]] に設定され、なければ [[0]] となります [SRC[>>104]]。

;; [111] [[W3C DOM]] 時代には、[[例外]]の種別を識別する唯一の方法が
[CODE(DOMa)@en[[[code]]]] でした。しかし数値の[[定数]]によって[[列挙型]]を表す方法は
[[JavaScript]] 的ではなく ([[Java]] 流であり)、 [[DOM4]] 時代以後新たなエラーには
[CODE(DOMa)@en[[[code]]]] を割り当てず、[[エラー名]]文字列による識別が導入されています。

[134] 
[CODE[GeolocationPositionError]]
[[インターフェイス]]にも、
同じような
[CODE[code][DOMException]]
[[IDL属性]]があります。
[SRC[>>133]]
設定される値は [CODE[unsigned short]] で [SRC[>>133]]、 [CODE[DOMException]]
とは別系統です。
[SEE[ 実例は[[GeolocationPositionError]] ]]

* 歴史

** W3C DOM 時代

[64] [CODE[DOMException]] は [[DOM1]] で導入されました。当時の [[W3C DOM]]
は [[OMG IDL]] を用いており、その [CODE[exception]] として定義されていました。
[[Java束縛]]では [[Java]] の[[例外]]に、 [[JavaScript束縛]]では [[JavaScript]]の
の[[例外]]に対応付けられることが想定されていました。

[1] [[DOM]] では、処理を行えない時に[DFN[[RUBYB[例外] [exception]]]]が発生します。
特に DOM 全般で発生し得る例外や DOM Core Module・XML Module で使われる例外が
[DFN[[CODE(DOM)[DOMException]]]] です。

ちなみに、処理が行えない時というのは (1) 論理的理由から行えない時、
(2) データが失われた時 (3) 実装が不安定な時などです。
通常索引に範囲外の値が指定された場合などは例外ではなく
[CODE(DOM)[[[null]]]] 値が返される程度で済まされます。
また、束縛によっては例外という概念がないので、返し値などで伝達されることになります。

[4] [CODE(DOM)[DOMException]] は DOM Core Module の一部です。
すべての DOM 実装が完全に実装しなければなりません。

[5] 仕様書:
- [DOM 1] Core Exception [CODE(DOM)[DOMException]]
<IW:DOM1:"level-one-core.html#ID-17189187">
- [DOM 2] Core Exception [CODE(DOM)[DOMException]]
<IW:DOM2:"Core/core.html#ID-17189187">
- [DOM 3] Core Exception [CODE(DOM)[DOMException]]
<IW:DOM3:"Core/core.html#ID-17189187">

[6] [CODE(DOM)[DOMException]] の例外の種類は定義群
[CODE(DOM)[[[ExceptionCode]]]] の定数で識別されます。

[7]
,名前	,型	,出典
,[CODE(DOM)[[[code]]]]	,[CODE(DOM)[[[unsigned]] [[short]]]]	,"[DOM 1,2,3]"

[8]
[CODE(DOM)[DOMSTRING_SIZE_ERR]] はほとんどすべての [CODE(DOM)[DOMString]] 型メソッド・属性で発生し得ると思うのですが、
仕様書には一部のメソッド・属性にしか書いてありません。
例えば [CODE(DOM)[[CODE(DOMi)[[[Node]]]].[CODE(DOMa)[[[localName]]]]]] 取得時に起こっても不思議はないのですが、
実際にはそんな猛烈な長さの名前など到底使われそうにも無いからなのか、例外が発生し得るとは書いてありません。
([[名無しさん]])

[9]
[CITE[IRC logs: freenode / #whatwg / 20080811]] ([CODE[2008-08-14 19:22:43 +09:00]] 版) <http://krijnhoetmer.nl/irc-logs/whatwg/20080811>

*** 例外符号

[11] 

,[CODE(DOMc)@en[[[INVALID_EXPRESSION_ERR]]]],[CODE(DOM)[[[51]]]],[[DOM XPath]] ([CODE(DOMi)@en[[[XPathException]]]])
,[CODE(DOMc)@en[[[TYPE_ERR]]]],[CODE(DOM)[[[52]]]],[[DOM XPath]] ([CODE(DOMi)@en[[[XPathException]]]])
,[CODE(DOMc)@en[[[NO_SCHEMA_AVAILABLE_ERR]]]],[CODE(DOM)[[[71]]]],[[DOM妥当性検証]] ([CODE(DOMi)@en[[[ExceptionVal]]]])
,[CODE(DOMi)@en[[[PARSE_ERR]]]],[CODE(DOM)[[[81]]]],[[DOM LS]] ([CODE(DOMi)@en[[[LSException]]]])
,[CODE(DOMi)@en[[[SERIALIZE_ERR]]]],[CODE(DOM)[[[82]]]],[[DOM LS]] ([CODE(DOMi)@en[[[LSException]]]])


[53] [[DOM3]] で導入された[[例外]]
[DFN[[CODE[LSException]]]],
[DFN[[CODE[ExceptionVal]]]],
[DFN[[CODE[XPathException]]]]
の[[符号]]は [CODE(DOMi)@en[[[DOMException]]]]
とかぶらないようになっていますが、 [[DOM2]] で導入されたもの
([CODE(DOMi)@en[[[EventException]]]], [CODE(DOMi)@en[[[RangeException]]]]) はかぶっています。

[83] 完成しなかった [[DOM AS]] も古い時期で放棄されたためか [CODE(DOMi)@en[[[DOMException]]]]
とかぶっています。

[132] 
時代的に [[DOM3]] より少し後に当たる
[CODE[GeolicationPositionError]]
は[[例外]]同様の[[インターフェイス]]になっていますが、
符号はかぶっています。
そのためか、
[CODE[DOMException]]
以外の[[例外]]が廃止された後も
[CODE[GeolocationPositionError]]
は存続しています。

[84] なんで60番台は使われていないのでしょう。

[94] 定義群 [DFN[[CODE(DOM)[ExceptionCode]]]] は、
[CODE(DOM)[[[DOMException]]]] の[[例外]]の種類を表す定数群です。

仕様書:
- [DOM 1] Core Definition group [CODE(DOM)[ExceptionCode]]
<IW:DOM1:"level-one-core.html#ID-258A00AF">
- [DOM 2] Core Definition group [CODE(DOM)[ExceptionCode]]
<IW:DOM2:"Core/core.html#ID-258A00AF">
- [DOM 3] Core Definition group [CODE(DOM)[ExceptionCode]]
<IW:DOM3:"Core/core.html#ID-258A00AF">

[95] 
,定数名	,定数値	,説明	,水準
,[CODE(DOM)[[[DOMSTRING_SIZE_ERR]]]]	,[CODE(DOM)[2]]	,文の指定された範囲が [CODE(DOM)[[[DOMString]]]] に一致しません。	,"DOM 1,2,3"
,[CODE(DOM)[[[HIERARCHY_REQUEST_ERR]]]]	,[CODE(DOM)[3]]	,[CODE(DOM)[[[Node]]]] がどこか所属しない場所に挿入しようとしています。	,"DOM 1,2,3"
,[CODE(DOM)[[[INDEX_SIZE_ERR]]]]	,[CODE(DOM)[1]]	,索引または寸法が負か、認められる値を超えています。	,"DOM 1,2,3"
,[CODE(DOM)[[[INUSE_ATTRIBUTE_ERR]]]]	,[CODE(DOM)[10]]	,すでにどこかで使われている属性を追加しようとしています。	,"DOM 1,2,3"
,[CODE(DOM)[[[INVALID_ACCESS_ERR]]]]	,[CODE(DOM)[15]]	,引数または演算に当該物体は対応していません。	,"DOM 2,3"
,[CODE(DOM)[[[INVALID_CHARACTER_ERR]]]]	,[CODE(DOM)[5]]	,不当または不法な文字が (例えば XML の[[名前]]中で) 指定されています。	,"DOM 1,2,3"
,[CODE(DOM)[[[INVALID_MODIFICATION_ERR]]]]	,[CODE(DOM)[13]]	,当該物体の型を修正しようとしています。	,"DOM 2,3"
,[CODE(DOM)[[[INVALID_STATE_ERR]]]]	,[CODE(DOM)[11]]	,使用可能でないか、既に使用不能な物体を使おうとしています。	,"DOM 2,3"
,[CODE(DOM)[[[NAMESPACE_ERR]]]]	,[CODE(DOM)[14]]	,名前空間に関して不正な方法で物体を作成または変更しようとしています。	,"DOM 2,3"
,[CODE(DOM)[[[NOT_FOUND_ERR]]]]	,[CODE(DOM)[8]]	,[CODE(DOM)[Node]] を存在しない文脈で参照しようとしています。	,"DOM 1,2,3"
,[CODE(DOM)[[[NOT_SUPPORTED_ERR]]]]	,[CODE(DOM)[9]]	,要求された型の物体または演算に実装は対応していません。	,"DOM 1,2,3"
,[CODE(DOM)[[[NO_DATA_ALLOWED_ERR]]]]	,[CODE(DOM)[6]]	,データに対応していない [CODE(DOM)[Node]] でデータを指定しています。	,"DOM 1,2,3"
,[CODE(DOM)[[[NO_MODIFICATION_ALLOWED_ERR]]]]	,[CODE(DOM)[7]]	,修正が認められていない物体を修正しようとしています。	,"DOM 1,2,3"
,[CODE(DOM)[[[SYNTAX_ERR]]]]	,[CODE(DOM)[12]]	,不当または不法な文字列が指定されています。	,"DOM 2,3"
,[CODE(DOM)[[[TYPE_MISMATCH_ERR]]]]	,[CODE(DOM)[17]]	,物体の型が物体に関連付けられた引数の型として期待されるものと非互換です。	,DOM 3
,[CODE(DOM)[[[VALIDATION_ERR]]]]	,[CODE(DOM)[16]]	,[CODE(DOM)[Node]] が[[部分妥当性]]について不当となる操作をしようとしています。	,DOM 3
,[CODE(DOM)[[[WRONG_DOCUMENT_ERR]]]]	,[CODE(DOM)[4]]	,[CODE(DOM)[Node]] が作られたのと違う文書で使われています。	,"DOM 1,2,3"
,	,(その他)	,(W3C が将来の使用のために予約)	,"DOM 1 [ABBR[[[SE]]] [Second Edition]],2,3"

** WHATWG でのメンテナンス

[22] [[W3C DOM]] は [[DOM3]] を最後に放置されました。

[21] [CODE(DOMi)@en[[[DOMException]]]] への追加の[[例外符号]]は、
[[HTML Standard]] で規定された他、 [[WHATWG Wiki]] のページに一覧が掲載されていて、
他の仕様で規定された追加分もまとめられていました。

[142] 
[CITE@en[Exception Codes - WHATWG Wiki]] ([CODE[2007-09-25 18:06:18 +09:00]] 版) <http://wiki.whatwg.org/wiki/Exception_Codes>


[10]
[CITE@en[Exception Codes - WHATWG Wiki]] ([TIME[2008-08-11 07:36:37 +09:00]] 版) <http://wiki.whatwg.org/wiki/Exception_Codes>



[85] [CITE[IRC logs: freenode / #whatwg / 20100809]]
([TIME[2010-08-14 15:23:27 +09:00]] 版)
<http://krijnhoetmer.nl/irc-logs/whatwg/20100809#l-521>

[86] [CITE@en[Web Applications 1.0 r5311     Make the structured clone algorithm using DATA_CLONE_ERR rather than NOT_SUPPORTED_ERR, for sicking.Fixing http://www.w3.org/Bugs/Public/show_bug.cgi?id=10069]]
( ([TIME[2010-08-18 10:28:00 +09:00]] 版))
<http://html5.org/tools/web-apps-tracker?from=5310&to=5311>

[87] [CITE@en[Web Applications 1.0 r5416 Fix potential clash with File API.]]
( ([TIME[2010-09-07 04:28:00 +09:00]] 版))
<http://html5.org/tools/web-apps-tracker?from=5415&to=5416>

[88] [CITE[IRC logs: freenode / #whatwg / 20100913]]
( ([TIME[2010-09-26 22:31:37 +09:00]] 版))
<http://krijnhoetmer.nl/irc-logs/whatwg/20100913>

[89] [CITE@en[Web Applications 1.0 r5773 File API no longer uses DOMException]]
( ([TIME[2011-01-12 05:40:00 +09:00]] 版))
<http://html5.org/tools/web-apps-tracker?from=5772&to=5773>

[90] [CITE[IRC logs: freenode / #whatwg / 20110427]]
( ([TIME[2011-04-30 12:39:26 +09:00]] 版))
<http://krijnhoetmer.nl/irc-logs/whatwg/20110427>

[91] [CITE[Bug 10623 – Simplify Web IDL exceptions]]
( ([TIME[2011-06-28 23:02:06 +09:00]] 版))
<http://www.w3.org/Bugs/Public/show_bug.cgi?id=10623>

[92] [CITE[IRC logs: freenode / #whatwg / 20110415]]
( ([TIME[2012-11-25 02:42:52 +09:00]] 版))
<http://krijnhoetmer.nl/irc-logs/whatwg/20110415#l-993>

[93] [CITE[743888 – Replace SVGException and XPathException with DOMException]]
( ([TIME[2012-11-29 14:51:25 +09:00]] 版))
<https://bugzilla.mozilla.org/show_bug.cgi?id=743888>

[96] [[Chrome]] は [CODE(DOMa)@en[[[name]]]] [[属性]]に 
[CODE(DOMe)@en[[[INUSE_ATTRIBUTE_ERR]]]] のような定数名を設定します。 [TIME[2012-12-20T14:58:23.700Z]]

** DOM Standard

[23] [[W3C DOM]] にかわる [[WHATWG]] [[DOM Standard]] の標準化により、
すべてのエラーコードが再び一箇所で規定されるようになりました。
またその後の [[WHATWG]] や [[W3C]] [[WebApps WG]]、 [[public-script-coord]]
などの議論で、 [[Java]] 風の整数 + [[定数]]のエラーコードを新規追加せず文字列名によってエラーを区別することや、独自の[[例外]]インターフェイスに替えて専ら
[CODE(IDL)@en[[[DOMException]]]] を使うことが決まりました。

[REFS[
- [106] '''[CITE@en-US[DOM Standard]] ([TIME[2014-08-19 13:36:28 +09:00]] 版) <http://dom.spec.whatwg.org/#exception-domexception>'''
- [104] [CITE@en-US[DOM Standard]] ([TIME[2014-08-19 13:36:28 +09:00]] 版) <http://dom.spec.whatwg.org/#error-names-0>
]REFS]

[97] [CITE[Bug 101606 – DOMException name is incorrect]]
( ([TIME[2012-12-20 15:20:56 +09:00]] 版))
<https://bugs.webkit.org/show_bug.cgi?id=101606>

[98] [[DOM Standard]] は新しい [CODE(DOMa)@en[[[name]]]] を廃止されていない[[例外]]の種類に対してしか定義していませんが、
>>97 は廃止されたものも含めて新しいスタイルの [CODE(DOMa)@en[[[name]]]] を実装しています。

[99] [CITE[''''''[''''''whatwg'''''']'''''' DOMError not constructable]]
( ([TIME[2013-02-07 23:47:57 +09:00]] 版))
<http://lists.whatwg.org/pipermail/whatwg-whatwg.org/2013-February/038857.html>

[100] [CITE[ES Discuss]]
( ([TIME[2013-11-06 07:34:10 +09:00]] 版))
<http://esdiscuss.org/topic/creating-your-own-errors>

[101] [CITE[IRC logs: freenode / #whatwg / 20140401]]
( ([TIME[2014-04-02 23:03:41 +09:00]] 版))
<http://krijnhoetmer.nl/irc-logs/whatwg/20140401>

[102] [CITE[Inform the world DOMException and DOMError are moving out · db88f3a · whatwg/dom]]
( ([TIME[2014-04-11 23:00:00 +09:00]] 版))
<https://github.com/whatwg/dom/commit/db88f3a50274590a52aaabba97cacfaa84853933>

[103] [CITE[Improve warnings in Errors section. · 3287ee4 · whatwg/dom]]
( ([TIME[2014-06-05 11:59:35 +09:00]] 版))
<https://github.com/whatwg/dom/commit/3287ee475b41b8ee373affaab368422e500ef3c3>

[115] [CITE@en[Turns out nobody filed bugs for all these error names. And since IDL is ... · 26a792e · whatwg/dom]]
( ([TIME[2014-09-28 08:54:22 +09:00]] 版))
<https://github.com/whatwg/dom/commit/26a792e2375134ca6283797025ed7a9d448220b2>

** Web IDL 特別なオブジェクト時代

[24] [CODE(IDL)@en[[[DOMException]]]] 以外の[[例外]]を定義する必要が無くなったことから、
[[Web IDL]] の [CODE(IDL)@en[[[exception]]]] 機能は削除されることとなりました。
[CODE(IDL)@en[[[DOMException]]]] の規定も [[DOM Standard]] から [[Web IDL]]
へと移動しました。また、 [[JavaScript]] のエラー ([[単純例外]])
が利用できる場合はそちらを使う方が好ましいと考えられるようになり、
そのための規定も [[Web IDL]] で整備されています。

[116] [CITE@en[Bug 23367 – Move exceptions into IDL]]
( ([TIME[2014-10-04 12:47:53 +09:00]] 版))
<https://www.w3.org/Bugs/Public/show_bug.cgi?id=23367>

[117] [CITE@en[DOMException is in IDL. DOMError removed. https://www.w3.org/Bugs/Public... · 7fe5736 · whatwg/dom]]
( ([TIME[2014-10-10 07:55:36 +09:00]] 版))
<https://github.com/whatwg/dom/commit/7fe5736d3ed2717d71a3d2627b07dee97e10ef05>

[118] [CITE@en[DOMException is in IDL. DOMError removed. https://www.w3.org/Bugs/Public... · 7fe5736 · whatwg/dom]]
( ([TIME[2014-10-10 07:56:55 +09:00]] 版))
<https://github.com/whatwg/dom/commit/7fe5736d3ed2717d71a3d2627b07dee97e10ef05>

[119] [CITE@en[Removed IDL exceptions, baked in DOMException, and added Error and DOMEx... · 50e172e · heycam/webidl]]
( ([TIME[2014-10-10 07:57:03 +09:00]] 版))
<https://github.com/heycam/webidl/commit/50e172ec079db073c3724c9beac1b576fb5dbc47>

[18] [CITE@en[Web Applications 1.0 r8887 fix exception references to match where things are now defined]]
([TIME[2015-03-05 08:28:00 +09:00]] 版)
<https://html5.org/r/8887>

[19] [CITE@en[Bug 21740 – Guidance on DOMError and promises]]
( ([TIME[2014-02-21 09:14:26 +09:00]] 版))
<https://www.w3.org/Bugs/Public/show_bug.cgi?id=21740>

[46] [CITE@en[Merge pull request #22 from domenic/domexception-name · heycam/webidl@370fc8c]] ([TIME[2015-06-01 22:32:08 +09:00]] 版) <https://github.com/heycam/webidl/commit/370fc8c6e9db2aaf017b266b4b00a36aeedffaf9>

[49] [CITE@en[Merge pull request #472 from w3c/errorManagement · w3c/webrtc-pc@2774184]]
([TIME[2016-02-05 14:41:18 +09:00]] 版)
<https://github.com/w3c/webrtc-pc/commit/27741843a39b5300fced351be124f54d92dc1970>

[50] [CITE@en[Merge branch 'not-allowed-error' of git://github.com/mounirlamouri/we… · heycam/webidl@b460b6a]]
([TIME[2016-02-16 11:00:13 +09:00]] 版)
<https://github.com/heycam/webidl/commit/b460b6a875fdfe7dc34f40d1eb57ed1ae8d8f5f5>

[54] [CITE@en[743888 – Replace SVGException and XPathException with DOMException]]
( ([TIME[2016-05-07 11:33:23 +09:00]]))
<https://bugzilla.mozilla.org/show_bug.cgi?id=743888>

[55] [CITE@en[21740 – Guidance on DOMError and promises]]
( ([TIME[2016-06-03 17:59:45 +09:00]]))
<https://www.w3.org/Bugs/Public/show_bug.cgi?id=21740>

[56] [CITE@en[27732 – DOMException lost some constants.]]
([TIME[2016-10-26 15:54:35 +09:00]])
<https://www.w3.org/Bugs/Public/show_bug.cgi?id=27732>

[57] [CITE@en[Deprecate InvalidAccessError. (#246)]]
([[tobie]]著, [TIME[2016-12-08 18:38:08 +09:00]])
<https://github.com/heycam/webidl/commit/671706df92e2cece78d747c1db73fbf863e7ec86>

[58] [CITE@en[Add missing legacy error names. (#251)]]
([[tobie]]著, [TIME[2016-12-09 21:51:50 +09:00]])
<https://github.com/heycam/webidl/commit/c50ffc45f6e8c19262aed531bbe6b047101c3b06>

[59] [CITE@en[Exception cleanup (#250)]]
([[tobie]]著, [TIME[2016-12-13 18:46:16 +09:00]])
<https://github.com/heycam/webidl/commit/c2d602f15a60765832e52b9c4a62f7ae76b2950c>

[60] [CITE@en[Editorial: merge deprecated DOMExceptions back in main table (#285)]]
([[tobie]]著, [TIME[2017-01-25 23:16:13 +09:00]])
<https://github.com/heycam/webidl/commit/5c6c00b2ae700caee37ad00450011c2e812b1624>

[61] [CITE@en[Use DOMException rather than DOMError.]]
([[mkruisselbrink]]著, [TIME[2017-01-31 07:12:12 +09:00]])
<https://github.com/w3c/FileAPI/commit/98f4af667dee7ab88495df90759ed0c225b52672>

[62] [CITE@en[Clarify that exceptions are always thrown in the current Realm (#300)]]
([[domenic]]著, [TIME[2017-02-07 15:56:01 +09:00]])
<https://github.com/heycam/webidl/commit/20b87a7d44d94a153762a5c1c587779767afbfe6>

[43] [[DOMException]] は、 [[DOMExceptionプロトタイプオブジェクト]]から[[継承]]する[[プラットフォームオブジェクト]]によって表されます [SRC[>>34]]。

[44] [[DOMException]] は次の状態を持ちます。
[FIG(list members)[
:[[大域環境]]: [SRC[>>34]]
:[[Prototype]]:[[大域環境]]の [[DOMExceptionプロトタイプオブジェクト]] [SRC[>>34]]
:[[クラス文字列]]:[CODE[[[DOMException]]]] [SRC[>>34]]
]FIG]

*** 演算

[29] [[JavaScript]] 値から [CODE(IDL)@en[[[DOMException]]]] [[Web IDL値への変換]]は、
次のように定義されています [SRC[>>28]]。
[FIG(steps)[
= [30] 指定された値が [CODE(JS)@en[[[Object]]]] でないか、 
指定された値が [CODE(IDL)@en[[[DOMException]]]]
を表す[[プラットフォームオブジェクト]]でないなら、
[CODE(JS)@en[[[TypeError]]]] を[[投げ]]、停止します。
= [31] 指定された値と同じオブジェクトを指す [[Web IDL]] [CODE(IDL)@en[[[DOMException]]]] 値を返します。
]FIG]

[32] [[Web IDL]] 値から [[JavaScript値への変換]]は、
次のように定義されています [SRC[>>28]]。
[FIG(steps)[
= [33] 指定された値と同じオブジェクトを指す [[JavaScript]] [CODE(JS)@en[[[Object]]]]
値を返します。
]FIG]

*** 大域オブジェクト

[35] [[JavaScript大域オブジェクト]]は、次の[[特性]]を持たなければなりません [SRC[>>34]]。
[FIG(list members short)[
[FIGCAPTION[
[[JavaScript特性]]
]FIGCAPTION]
:名前:[DFN[[CODE(JS)@en[[[DOMException]]]]]]
:値:[[DOMException構築子オブジェクト]]
:[[Writable]]:[[真]]
:[[Enumerable]]:[[偽]]
:[[Configurable]]:[[真]]
]FIG]

*** 構築子オブジェクト

[36] [DFN[[RUBYB[DOMException構築子オブジェクト]@en[DOMException constructor object]]]]は、
次のような[[関数オブジェクト]]でなければ[['''なりません''']] [SRC[>>34]]。
[FIG(list members)[
[FIGCAPTION[
[[関数オブジェクト]]
]FIGCAPTION]
:[CODE[[[Prototype]]]]:[CODE[[[%Error%]]]]
:[CODE(JS)@en[[[prototype]]]] [[特性]]:
[FIG(list members short)[
[FIGCAPTION[
[[JavaScript特性]]
]FIGCAPTION]
:名前:[CODE(JS)@en[[[prototype]]]]
:値:[[DOMExceptionプロトタイプオブジェクト]]
:[[Writable]]:[[偽]]
:[[Enumerable]]:[[偽]]
:[[Configurable]]:[[偽]]
]FIG]
]FIG]

[47] [[[CODE(DOMi)@en[DOMException]]構築子オブジェクト]]は、[[初期オブジェクト]]です。

[37] 更に、[[エラー名表]]の各定数について、次のような[[特性]]がなければ[['''なりません''']]
[SRC[>>34]]。
[FIG(list members short)[
[FIGCAPTION[
[[JavaScript特性]]
]FIGCAPTION]
:名前:[[エラー名表]]の[[定数]]名
:値:[[エラー名表]]の[[定数]]値
:[[Writable]]:[[偽]]
:[[Enumerable]]:[[偽]]
:[[Configurable]]:[[偽]]
]FIG]

[39] [[構築子]]としての [[DOMException構築子オブジェクト]]は、
実行すると、新しい [CODE(IDL)@en[[[DOMException]]]] [[オブジェクト]]を作成し、返します。
第1引数は[[メッセージ (例外)]]と解釈されます。第2引数は省略可能で、
指定されたら [CODE(DOMa)@en[[[name]]]] として使われるとともに、
[CODE(DOMa)@en[[[code]]]] の設定に使われます。

[38] この[[関数]]は、次のように処理します [SRC[>>34]]。
[FIG(steps)[
= [VAR[F]] を、[[活性関数オブジェクト]]に設定します。
= [VAR[newTarget]] を、 [VAR[NewTarget]] (それが [CODE(JS)@en[[[undefined]]]] の場合は、
[VAR[F]]) に設定します。
= [VAR[F]] の [CODE[[[getPrototypeOf]]]] を実行します。
[VAR[super]] を、その実行結果に設定します。[[例外]]が投げられたなら伝播し、停止します。
= [VAR[super]] に [CODE[[[IsConstructor]]]] を適用した結果が[[偽]]なら、
[CODE(JS)@en[[[TypeError]]]] を投げ、停止します。
= [CODE[[[Construct]]]] を実行します。 [VAR[super]]、第1引数で構成されるリスト、
[VAR[newTarget]] を[[引数]]として渡します。 [VAR[O]] を、結果に設定します。
= [VAR[O]] の[[大域環境]]を、本[[関数]]の[[大域環境]]に設定します。
= 第2引数が [CODE(JS)@en[[[undefined]]]] 以外なら、
== [VAR[name]] を、第2引数の [CODE(JS)@en[[[ToString]]]] とします。
== [CODE[[[DefinePropertyOrThrow]]]] で [VAR[O]] の[[特性]]を次の通り設定します。
[[例外]]が投げられたなら伝播し、停止します。
[FIG(list members short)[
[FIGCAPTION[
[[JavaScript特性]]
]FIGCAPTION]
:名前:[CODE[[[name]]]]
:[[Value]]:[VAR[name]]
:[[Writable]]:[[真]]
:[[Enumerable]]:[[偽]]
:[[Configurable]]:[[真]]
]FIG]
== [CODE[[[DefinePropertyOrThrow]]]] で [VAR[O]] の[[特性]]を次の通り設定します。
[[例外]]が投げられたなら伝播し、停止します。
[FIG(list members short)[
[FIGCAPTION[
[[JavaScript特性]]
]FIGCAPTION]
:名前:[CODE[[[code]]]]
:[[Value]]:[[エラー名表]]で [VAR[name]] に相当する符号があればその値、なければ [CODE[0]]
:[[Writable]]:[[真]]
:[[Enumerable]]:[[偽]]
:[[Configurable]]:[[真]]
]FIG]
= [VAR[O]] を返します。
]FIG]

*** プロトタイプオブジェクト

[40] [DFN[[RUBYB[DOMExceptionプロトタイプオブジェクト]@en[DOMException prototype object]]]]は、
次のような[[オブジェクト]]でなければ[['''なりません''']] [SRC[>>34]]。
[FIG(list members)[
[FIGCAPTION[
[[JavaScriptオブジェクト]]
]FIGCAPTION]
:[[Prototype]]:[CODE[[[%ErrorPrototype%]]]]
:[[クラス文字列]]:[DFN[[CODE[[[DOMExceptionPrototype]]]]]]
:[CODE[[[constructor]]]] [[特性]]:
[FIG(list members short)[
[FIGCAPTION[
[[JavaScript特性]]
]FIGCAPTION]
:名前:[CODE[[[constructor]]]]
:[[Value]]:[[DOMException構築子オブジェクト]]
:[[Writable]]:[[真]]
:[[Enumerable]]:[[偽]]
:[[Configurable]]:[[真]]
]FIG]
]FIG]

[48] [[[CODE(DOMi)@en[DOMException]]プロトタイプオブジェクト]]は、[[初期オブジェクト]]です。

[41] 更に、[[エラー名表]]の各定数について、次のような[[特性]]がなければ[['''なりません''']]
[SRC[>>34]]。
[FIG(list members short)[
[FIGCAPTION[
[[JavaScript特性]]
]FIGCAPTION]
:名前:[[エラー名表]]の[[定数]]名
:[[Value]]:[[エラー名表]]の[[定数]]値
:[[Writable]]:[[偽]]
:[[Enumerable]]:[[真]]
:[[Configurable]]:[[偽]]
]FIG]


** Web IDL 通常オブジェクト時代

[65] [TIME[2017年][year:2017]]、実装状況に合わせる形で、
[CITE[Web IDL]] [[仕様書]]の本文で規定される
[[JavaScriptオブジェクト]]という形から、 [[Web IDL]] [[インターフェイス]]へと変更されました。

[63] [CITE@en[Re-align DOMException objects with what is implemented (#378)]]
([[domenic]]著, [TIME[2017-07-03 03:33:16 +09:00]])
<https://github.com/heycam/webidl/commit/5c8eb310ef7a6bcb3c4813e9791212ee1624f2d3>

[76] [CITE@en[DOMException function definition makes no sense · Issue #55 · heycam/webidl]]
([TIME[2017-08-21 22:34:07 +09:00]])
<https://github.com/heycam/webidl/issues/55>

[77] [CITE@en[DOMException function definition makes no sense · Issue #55 · heycam/webidl]]
([TIME[2017-08-21 22:39:34 +09:00]])
<https://github.com/heycam/webidl/issues/55>

[78] [CITE@en[Re-align DOMException objects with what is implemented by domenic · Pull Request #378 · heycam/webidl]]
([TIME[2017-08-21 22:39:58 +09:00]])
<https://github.com/heycam/webidl/pull/378>

[79] [CITE@en[Remove DOMException terminal from the grammar]]
([[domenic]]著, [TIME[2017-07-20 04:42:48 +09:00]])
<https://github.com/heycam/webidl/commit/b0855366cc78001725b26ec5c9096c9d3a101f62>

[80] [CITE@en[Remove DOMException terminal from the grammar by domenic · Pull Request #385 · heycam/webidl]]
([TIME[2017-08-21 22:49:10 +09:00]])
<https://github.com/heycam/webidl/pull/385>

[105] [CITE@en[Use `DOMException` instead of `Error` in `SensorErrorEvent`]]
([[pozdnyakov]]著, [TIME[2017-10-11 22:42:19 +09:00]])
<https://github.com/w3c/sensors/commit/810d1a9b646585d954f4798e227cbf218a2ff9eb>

[107] [CITE@en[Editorial: use "exception name" DOMException notation]]
([[tobie]]著, [TIME[2017-10-12 18:35:25 +09:00]])
<https://github.com/whatwg/dom/commit/9d83a6406bc57a7deeb5c0831c388bae752f2e5e>

[108] [CITE@en[Editorial: use "exception name" DOMException notation by tobie · Pull Request #518 · whatwg/dom]]
([TIME[2017-10-14 12:29:48 +09:00]])
<https://github.com/whatwg/dom/pull/518>

[120] [CITE@en[Editorial: cleanup exception terminology]]
([[annevk]]著, [TIME[2018-04-10 23:37:38 +09:00]])
<https://github.com/whatwg/xhr/commit/4b7915e396bbdf3ae39495740c581556e4020eaf>

[121] [CITE@en[Editorial: use "{{ExceptionType!!exception}}" {{DOMException}} throughout · Issue #173 · whatwg/xhr]]
([TIME[2018-04-11 12:15:33 +09:00]])
<https://github.com/whatwg/xhr/issues/173>

[122] [CITE@en[Editorial: cleanup exception terminology by annevk · Pull Request #195 · whatwg/xhr]]
([TIME[2018-04-11 12:15:38 +09:00]])
<https://github.com/whatwg/xhr/pull/195>

[123] [CITE@en[Clarify note about DOMException]]
([[Ms2ger]]著, [TIME[2019-05-20 16:46:10 +09:00]])
<https://github.com/heycam/webidl/commit/4ef350963f4b9ef5246b2bc420d8bab8ed7b6282>

[124] [CITE@en[Remove the Error IDL type by Ms2ger · Pull Request #728 · heycam/webidl]]
([TIME[2019-12-25 11:57:57 +09:00]])
<https://github.com/heycam/webidl/pull/728>

[125] [CITE@en[Remove DOMException conversion section]]
([[Ms2ger]]著, [TIME[2019-05-17 23:03:00 +09:00]])
<https://github.com/heycam/webidl/commit/ff88ac4876d747a2ae3ad553f42525927bde4605>

[126] [CITE@en[Remove the Error IDL type by Ms2ger · Pull Request #728 · heycam/webidl]]
([TIME[2020-01-12 14:13:33 +09:00]])
<https://github.com/heycam/webidl/pull/728>

[127] [CITE@en[Remove the 'exception types' definition]]
([[Ms2ger]]著, [TIME[2019-05-17 23:21:01 +09:00]])
<https://github.com/heycam/webidl/commit/faaee577b0c0c03338b139754835ac999de507be>

[128] [CITE@en[Use new syntax for DOMException. (#780)]]
([[Ms2ger]]著, [TIME[2019-08-29 23:21:42 +09:00]])
<https://github.com/heycam/webidl/commit/21ffd9bd979bbebc99d1b7ed28c4f56b7c02b018>

[129] [CITE@en[Use new syntax for DOMException. by Ms2ger · Pull Request #780 · heycam/webidl]]
([TIME[2020-01-12 17:10:17 +09:00]])
<https://github.com/heycam/webidl/pull/780>

[130] [CITE@en[Revert "Use new syntax for DOMException. (#780)"]]
([[bzbarsky]]著, [TIME[2019-08-30 00:25:08 +09:00]])
<https://github.com/heycam/webidl/commit/182b487c128bce00e62431f19458c15fe91e9738>

[131] [CITE@en[Revert "Use new syntax for DOMException." by bzbarsky · Pull Request #781 · heycam/webidl]]
([TIME[2020-01-12 17:14:15 +09:00]])
<https://github.com/heycam/webidl/pull/781>

[135] [CITE@en[Remove use of '''['''Constructor''']''' extended attribute]]
([[clelland]]著, [TIME[2019-09-22 04:35:33 +09:00]])
<https://github.com/heycam/webidl/commit/9e514c9dcfb09919af971931409aa075451804a5>

[136] [CITE@en[Remove use of '''['''Constructor''']''' extended attribute by clelland · Pull Request #798 · heycam/webidl]]
([TIME[2020-05-14 14:26:13 +09:00]])
<https://github.com/heycam/webidl/pull/798>

[137] [CITE@en[Copy the DOM XPath interfaces from the WHATWG wiki by foolip · Pull Request #763 · whatwg/dom]]
([TIME[2020-07-14 15:20:34 +09:00]])
<https://github.com/whatwg/dom/pull/763>

[138] [CITE@en[Mark DOMException as serializable by yutakahirano · Pull Request #732 · heycam/webidl]]
([TIME[2021-04-12T06:51:33.000Z]])
<https://github.com/heycam/webidl/pull/732>

[139] [CITE@en[Make DOMException serializable]]
([[yutakahirano]], [TIME[2019-07-04 00:04:17 +09:00]], [TIME[2021-04-12T07:08:52.000Z]])
<https://github.com/heycam/webidl/commit/f23ef42038a1d6af6ba19806c8246673711ee7ca>

[140] [CITE@en[Define serialization and deserialization steps for DOMException · Issue #729 · heycam/webidl]]
([TIME[2021-04-12T07:10:37.000Z]])
<https://github.com/heycam/webidl/issues/729>

[141] [CITE@en[Mark DOMException as serializable by yutakahirano · Pull Request #732 · heycam/webidl]]
([TIME[2021-04-12T07:11:59.000Z]])
<https://github.com/heycam/webidl/pull/732>