try { ...} catch { ...}
如果 try 块中的代码产生缺点,则中断实行,然后跳到 catch 块中连续实行。如果 try 块中代码没有非常,则不会实行 catch 块中的代码。
try/catch/finally 语句的语法格式:
try { ...} catch { ...} finally { ...}
finally 块中的代码是一定会实行的。

如:
let a: any = nulltry { console.log('开始') console.log(a.name);} catch { console.log('非常')} finally { console.log('末了')}
输出:
开始非常末了
如果 finally 块中有 return 语句,就会导致 try 和 catch 块中的 return 语句不起浸染,只有 finally 语句中的 return 语句有效。如:
function demo(): number { try { return 0; } catch { return 1; } finally { return 2; }}console.log(demo());
输出:
2
12.2非常工具
当抛出非常时,程序会产生一个非常工具,该工具的属性:
name - 非常名称message - 非常的描述信息在 catch 关键字后面可以声明这个工具参数,然后在代码中可以利用该工具,语法格式:
...catch (参数名) {...}...
如:
let a: any = nulltry { console.log('开始') console.log(a.name);} catch (error) { console.log('非常') console.log(error.name); console.log(error.message);} finally { console.log('末了');}
输出:
开始非常TypeErrorCannot read properties of null (reading 'name')末了
12.3TypeScript 内置非常工具12.3.1RangeError
RangeError 工具可用来表示输入的数值超出范围。如:
try { const n = 1.2345; console.log(n.toFixed(1000));} catch (err) { console.log(err instanceof RangeError);}
以上程序会输出true,由于数值的toFixed方法的第一个参数只能是0 ~ 20的数值,若为负数或是超过20(或超过20太多),就会抛出RangeError工具。
我们也可以自己 new 一个RangeError工具来抛出,RangeError的布局函数可传入一个字符串作为缺点描述。如:
function discount(price: number, percentage: number): number { if (percentage >= 0 && percentage <= 100) { return price (1 - percentage / 100); } else { throw new RangeError("The form of the percentage needs to be from 0 to 100."); }} try { console.log(discount(100, 20)); console.log(discount(100, 999));} catch (err) { console.log(err);}
输出:
RangeError: The form of the percentage needs to be from 0 to 100. at discount (index.js:7:15) at Object.<anonymous> (index.js:12:17) at Module._compile (internal/modules/cjs/loader.js:774:30) at Object.Module._extensions..js (internal/modules/cjs/loader.js:785:10) at Module.load (internal/modules/cjs/loader.js:641:32) at Function.Module._load (internal/modules/cjs/loader.js:556:12) at Function.Module.runMain (internal/modules/cjs/loader.js:837:10) at internal/main/run_main_module.js:17:11
RangeError工具除了有输出我们传入其布局函数作为参数的The form of the percentage needs to be from 0 to 100.字符串外,还有输出RangeError工具被抛出的位置,以及干系的堆栈解开(stack unwinding)信息。(只不过这边输出的位置是指JavaScript程序的位置,并不是TypeScript程序。)
也便是说,throw关键字该当要只管即便利用JavaScript内置的专门用来被抛出的工具。
12.3.2ReferenceError造孽引用导致的缺点。当我们在 JavaScript 中利用 JavaScript 不认识的名称时,就会抛出这个工具。当然,由于我们是用 TypeScrip t来开拓 JavaScript 程序,这个状况并不会常常碰着。如:
declare const n: number; try { console.log(n);} catch (err) { console.log(err instanceof ReferenceError);}
以上程序会输出true,由于程序第一行只是在 TypeScript中假声明出n这个常数。以是程序第四行要访问n时会抛出ReferenceError工具。
12.3.3SyntaxError语法缺点。JavaScript 内置的eval函数有一个参数,可以将 JavaScript 代码作为字符串传入,如此一来就能够在程序运行阶段动态地产生并运行JavaScript代码。如:
try { const result = eval(` function addOne(x) { return x + 1; } addOne(1); `); console.log(result);} catch (err) { console.log(err instanceof SyntaxError);}
以上程序会输出2。
当传进eval函数的字符串内的JavaScript的语法有缺点时,就会抛出这个例外。如:
try { const result = eval(` function addOne(x) { return x + 1; addOne(1); `); console.log(result);} catch (err) { console.log(err instanceof SyntaxError);}
以上程序会输出true,由于我们把addOne函数的结尾大括号}删除了。
12.3.4TypeError类型缺点。
如果f是一个函数,则f()阐述可以调用它,但如果f不是一个函数,此时用f()考试测验调用它的话,就会抛出TypeError工具;如果T是一个种别或是函数,则new T()阐述可以创建其工具实体,但如果T不是一个种别或是函数,此时用new T()阐述考试测验创建其工具实体的话,就会抛出TypeError工具。当然,由于我们是用 TypeScript 来开拓 JavaScript 程序,这个状况并不会常常碰着。如:
const T = { f1: 1, f2: "2",}; try { console.log(new (T as any)());} catch (err) { console.log(err instanceof TypeError);}
以上程序会输出true,由于工具T只是大括号工具,无法直接被 new 出工具实体。
12.3.5URIErrorencodeURI() 或 decodeURI() 等函数实行缺点。
JavaScript内置的encodeURI和decodeURI函数可以用来安全地编码与解码URI。
用法如下:
const originalURL = "https://magiclen.org/中文"; const encodedURL = encodeURI(originalURL); console.log(encodedURL); const decodedURL = decodeURI(encodedURL); console.log(decodedURL);
以上程序的输出结果如下:
https://magiclen.org/%E4%B8%AD%E6%96%87https://magiclen.org/中文
如果只是要编码或解码URI的个中一个部件(component),可以利用JavaScript内置的encodeURIComponent或decodeURIComponent函数。
用法如下:
const originalURLComponent = "中文"; const encodedURLComponent = encodeURIComponent(originalURLComponent); console.log(encodedURLComponent); const decodedURLComponent = decodeURIComponent(encodedURLComponent); console.log(decodedURLComponent);
以上程序的输出结果如下:
%E4%B8%AD%E6%96%87中文
在利用encodeURI、decodeURI、encodeURIComponent或decodeURIComponent函数时,若输入的参数有误(非精确格式的URI),就会抛出URIError工具。如:
try { console.log(encodeURI("\uD800"));} catch (err) { console.log(err instanceof URIError);} try { console.log(decodeURI("%"));} catch (err) { console.log(err instanceof URIError);} try { console.log(encodeURIComponent("\uD800"));} catch (err) { console.log(err instanceof URIError);} try { console.log(decodeURIComponent("%"));} catch (err) { console.log(err instanceof URIError);}
输出:
truetruetruetrue
JavaScript无法编码含有\uD800 ~ \uDFFF字符的字符串。而\u是JavaScript的字符表示办法,其后可以接上2个字节长度的16进制数值,作为这个字符的字符值。其余还有\x,可以接上1个字节长度的16进制数值。
12.3.6Error上面先容的RangeError、ReferenceError、SyntaxError、TypeError、URIError都继续自Error。我们可以把任何不属于上述缺点的缺点都用Error工具来表示。
Error的布局函数可传入一个字符串作为缺点描述。如:
try { throw new Error("Something wrong!");} catch (err) { console.log(err);}
输出:
Something wrong!
在实际项目中,一样平常会根据非常工具,针对性地进行处理,如:
try { ...} catch (err) { if (err instanceof ReferanceError) { ...... } else if (err instanceof TypeError) { ...... } ......}
12.4抛出非常
在 TypeScript 中,可以通过 throw 关键字抛出非常,语法如下:
throw 非常工具
可以通过布局函数实例化新的非常工具。语法格式:
new 非常工具(自定义缺点信息);
抛出Error干系工具时不该用new关键字:RangeError、ReferenceError、SyntaxError、TypeError、URIError和Error除了可以被 new 出工具实体之外,也可以直接用调用函数的办法来让它们回传自己的工具实体。如:
try { throw Error("Something wrong!");} catch (err) { console.log(err);}
12.5自定义非常
除了利用内置非常外,还可以通过继续内置非常类型创建自定义非常类型。自定义非常类型须要供应 name 和 message 两个属性。如:
class CustomError extends Error { constructor(message: string) { super(message); this.name = 'Custom Error'; this.message = message; }}
然后在代码中可以抛出这个自定义非常,如:
try { throw new CustomError('出错了!');} catch (error: any) { console.log(error instanceof CustomError); console.log(`Error: ${error.name} - ${error.message}`);}