JavaScript 異常處理
點擊上方藍色字體,選擇“標星公眾號”
優(yōu)質(zhì)文章,第一時間送達
? 作者?|?云崖先生?
來源 | urlify.cn/Ebqiyq
1、程序異常
程序異常可分為邏輯異常和語法異常,對于初學(xué)者而言語法異常居多,隨著不斷的學(xué)習(xí)對語言越來越熟悉后語法異常減少邏輯異常增多。
在JavaScript中提供了對異常進行處理的語句,在適當?shù)臅r候使用它們能夠使程序變得更加健壯。
但是要注意不要濫用異常處理,它會使程序的可讀性變差。
2、異常對象
? ??所有的異常都是對象
? 異常類型
在JavaScript中,常見異常類型有以下幾種。

3、異常捕獲??
? ?try catch
使用try與catch語句進行捕獲異常。
try用于檢測可能出現(xiàn)異常的代碼塊
catch用于處理捕捉到的異常,可指定參數(shù)獲取異常信息
try...catch?語句有一個包含一條或者多條語句的try代碼塊,0個或1個的catch代碼塊,catch代碼塊中的語句會在try代碼塊中拋出異常時執(zhí)行。
如果try代碼塊中的語句(或者try?代碼塊中調(diào)用的方法)一旦拋出了異常,那么執(zhí)行流程會立即進入catch代碼塊。
如果try代碼塊沒有拋出異常,catch代碼塊就會被跳過。
<script>
????????"use strict";
????????try?{
????????????????console.log(username);
????????} catch?(e) { // 會捕獲異常的所有信息
????????????????console.log("處理了一個異常:", e);
????????}
/*
處理了一個異常: ReferenceError: username is not defined
????at 1.html:56
*/
script>finally
finally塊包含了在try和catch塊完成后、下面接著try...catch的語句之前執(zhí)行的語句。
finally塊無論是否拋出異常都會執(zhí)行。如果拋出了一個異常,就算沒有異常處理,finally塊里的語句也會執(zhí)行。
<script>
????????"use strict";
????????try?{
????????????????console.log(username);
????????} catch?(e) { // 會捕獲異常的所有信息
????????????????console.log("處理了一個異常,ID:", e);
????????} finally?{
????????????????console.log("無論有沒有異常都會執(zhí)行我");
????????}
script>4、主動異常
throw語句拋出異常。<script>
????????"use strict";
????????throw?new?Error("這是一個錯誤")
script><script>
????????"use strict";
????????throw?"Error2"; // String type
????????throw?42; // Number type
????????throw?true; // Boolean type
????????throw?{ toString: function?() { return?"I'm an object!"; } };
script>5、自定義異常
繼承Error原型對象,可配置自定義的異常。
Error構(gòu)造函數(shù)具有message可選參數(shù),用于顯示人類可閱讀的錯誤描述信息
函數(shù)形式
<script>
????????"use strict";
????????function?MyError(message) {
????????????????this.name = 'MyError';
????????????????this.message = message || 'Default Message';
????????????????this.stack = (new?Error()).stack;
????????}
????????Object.setPrototypeOf(MyError, Error); // 繼承Error原型對象
????????try?{
????????????????throw?new?MyError();
????????} catch?(e) {
????????????????console.log(e.name); // MyError
????????????????console.log(e.message); // Default Message
????????}
????????try?{
????????????????throw?new?MyError("自定義異常被拋出");
????????} catch?(e) {
????????????????console.log(e.name); // MyError
????????????????console.log(e.message); // 自定義異常被拋出
????????}
script>類形式
<script>
????????"use strict";
????????class?MyError?extends?Error?{
????????????????constructor(message) {
????????????????????????super();
????????????????????????this.name = "MyError";
????????????????????????this.message = message || 'Default Message';
????????????????????????this.stack = (new?Error()).stack;
????????????????}
????????}
????????try?{
????????????????throw?new?MyError();
????????} catch?(e) {
????????????????console.log(e.name); // MyError
????????????????console.log(e.message); // Default Message
????????}
????????try?{
????????????????throw?new?MyError("自定義異常被拋出");
????????} catch?(e) {
????????????????console.log(e.name); // MyError
????????????????console.log(e.message); // 自定義異常被拋出
????????}
script>

??? ?
感謝點贊支持下哈?
