# require-throws * [Options](#user-content-require-throws-options) * [`contexts`](#user-content-require-throws-options-contexts) * [`exemptedBy`](#user-content-require-throws-options-exemptedby) * [Context and settings](#user-content-require-throws-context-and-settings) * [Failing examples](#user-content-require-throws-failing-examples) * [Passing examples](#user-content-require-throws-passing-examples) Requires that throw statements are documented. See [this discussion](https://stackoverflow.com/questions/50071115/typescript-promise-rejection-type) on why TypeScript doesn't offer such a feature. Note that since throw statements within async functions end up as rejected `Promise`'s, they are not considered as throw statements for the purposes of this rule. See the `require-rejects` rule for a non-standard way to document `Promise` rejections. ## Options A single options object has the following properties. ### contexts Set this to an array of strings representing the AST context (or objects with optional `context` and `comment` properties) where you wish the rule to be applied. `context` defaults to `any` and `comment` defaults to no specific comment context. Overrides the default contexts (`ArrowFunctionExpression`, `FunctionDeclaration`, `FunctionExpression`). Set to `"any"` if you want the rule to apply to any JSDoc block throughout your files (as is necessary for finding function blocks not attached to a function declaration or expression, i.e., `@callback` or `@function` (or its aliases `@func` or `@method`) (including those associated with an `@interface`). ### exemptedBy Array of tags (e.g., `['type']`) whose presence on the document block avoids the need for a `@throws`. Defaults to an array with `inheritdoc`. If you set this array, it will overwrite the default, so be sure to add back `inheritdoc` if you wish its presence to cause exemption of the rule. ## Context and settings | | | | -------- | --- | | Context | `ArrowFunctionExpression`, `FunctionDeclaration`, `FunctionExpression`; others when `contexts` option enabled | | Tags | `throws` | | Aliases | `exception` | |Recommended|false| | Options |`contexts`, `exemptedBy`| | Settings | `ignoreReplacesDocs`, `overrideReplacesDocs`, `augmentsExtendsReplacesDocs`, `implementsReplacesDocs` | ## Failing examples The following patterns are considered problems: ````ts /** * */ function quux (foo) { throw new Error('err') } // Message: Missing JSDoc @throws declaration. class Quux { /** * */ constructor (foo) { throw new Error('err') } } // Message: Missing JSDoc @throws declaration. /** * */ const quux = function (foo) { throw new Error('err') } // Message: Missing JSDoc @throws declaration. /** * */ const quux = (foo) => { throw new Error('err') } // Message: Missing JSDoc @throws declaration. /** * */ function quux (foo) { while(true) { throw new Error('err') } } // Message: Missing JSDoc @throws declaration. /** * */ function quux (foo) { do { throw new Error('err') } while(true) } // Message: Missing JSDoc @throws declaration. /** * */ function quux (foo) { for(var i = 0; i <= 10; i++) { throw new Error('err') } } // Message: Missing JSDoc @throws declaration. /** * */ function quux (foo) { for(num in [1,2,3]) { throw new Error('err') } } // Message: Missing JSDoc @throws declaration. /** * */ function quux (foo) { for(const num of [1,2,3]) { throw new Error('err') } } // Message: Missing JSDoc @throws declaration. /** * */ function quux (foo) { for(const index in [1,2,3]) { throw new Error('err') } } // Message: Missing JSDoc @throws declaration. /** * */ function quux (foo) { with(foo) { throw new Error('err') } } // Message: Missing JSDoc @throws declaration. /** * */ function quux (foo) { if (true) { throw new Error('err') } } // Message: Missing JSDoc @throws declaration. /** * */ function quux (foo) { if (false) { // do nothing } else { throw new Error('err') } } // Message: Missing JSDoc @throws declaration. /** * */ function quux (foo) { try { throw new Error('err') } catch(e) { throw new Error(e.message) } } // Message: Missing JSDoc @throws declaration. /** * */ function quux (foo) { try { // do nothing } finally { throw new Error(e.message) } } // Message: Missing JSDoc @throws declaration. /** * */ function quux (foo) { const a = 'b' switch(a) { case 'b': throw new Error('err') } } // Message: Missing JSDoc @throws declaration. /** * @throws */ function quux () { } // Settings: {"jsdoc":{"tagNamePreference":{"throws":false}}} // Message: Unexpected tag `@throws` /** * */ const directThrowAfterArrow = (b) => { const a = () => {}; if (b) { throw new Error('oops') } return a; }; // Message: Missing JSDoc @throws declaration. /** * @throws {never} */ function quux (foo) { throw new Error('err') } // Message: JSDoc @throws declaration set to "never" but throw value found. ```` ## Passing examples The following patterns are not considered problems: ````ts /** * @throws An error. */ function quux () { throw new Error('err') } /** * */ function quux (foo) { try { throw new Error('err') } catch(e) {} } /** * @throws {object} */ function quux (foo) { throw new Error('err') } /** * @inheritdoc */ function quux (foo) { throw new Error('err') } /** * @abstract */ function quux (foo) { throw new Error('err') } /** * */ function quux (foo) { } /** * @type {MyCallback} */ function quux () { throw new Error('err') } // "jsdoc/require-throws": ["error"|"warn", {"exemptedBy":["type"]}] /** * */ const itself = (n) => n; /** * Not tracking on nested function */ const nested = () => () => {throw new Error('oops');}; /** */ async function foo() { throw Error("bar"); } /** * @throws {never} */ function quux (foo) { } ````