github at esdiscuss.org (2013-07-12T02:27:45.718Z)
Note that ```js (new DOMError) instanceof Error; ``` returns `false`. So the DOM does do the "strongly discouraged" thing. Is this ok or bad? Also, the DOM does not create a new class for each different value of `.name`. I.e. you can get a `DOMError` whose `.name` is `"NetworkError"` or `"AbortError"`. `DOMError` even has a constructor which allows setting `.name` to anything: `new DOMError(name, message);` In fact, there are no defined situations where the DOM creates `DOMError` objects whose `.name` is `"DOMError"`. Again, is this ok or is it bad practice?
On Wed, Jul 10, 2013 at 12:52 PM, Domenic Denicola <domenic at domenicdenicola.com> wrote: > Woah, François, that seems pretty overcomplicated; why not replace everything inside the constructor with `this.message = message`? It has the same effect in the browsers I've seen. (Also don't forget `SomeError.prototype.constructor = SomeError`.) > > Anyway, to Jonas's point: I think `DOMError` is actually pretty OK. One thing I noticed is that the ES5 spec (and presumably ES6, although I haven't checked) is careful to never throw simple `Error` objects, but instead `TypeError`s or `RangeError`s or so on. I infer that they are leaving bare `Error` for user cases. I think "the platform" should generally follow this lead; that is, the DOM should leave bare `Error`s to the user, and throw `DOMError`s or `TypeError`s or `RangeError`s for its own errors. > > To answer your more general question, authors are strongly discouraged from ever throwing anything that is not `instanceof Error`, see e.g. Guillermo Rauch's [A String is not an Error](http://www.devthought.com/2011/12/22/a-string-is-not-an-error/). Also, the `name` property is generally the same across all instances of a particular error type, i.e. > > ```js > errInstance.name === errInstance.constructor.name === errInstance.constructor.prototype.name === Object.getPrototypeOf(errInstance).name > ``` > > (You can verify this for all the built-in ES5 errors.) Usually a `code` property is used for more specific information, from what I've seen. But yes, that has to be added manually with a bit of awkwardness, i.e. > > ```js > const e = new DOMError("The message"); > e.code = "TimeoutError"; > throw e; > ``` Note that (new DOMError) instanceof Error; returns false. So the DOM does do the "strongly discouraged" thing. Is this ok or bad? Also, the DOM does not create a new class for each different value of .name. I.e. you can get a DOMError whose .name is "NetworkError" or "AbortError". DOMError even has a constructor which allows setting .name to anything: new DOMError(name, message); In fact, there are no defined situations where the DOM creates DOMError objects whose .name is "DOMError". Again, is this ok or is it bad practice? / Jonas