Hướng dẫn is try catch good javascript? - cố gắng nắm bắt javascript tốt không?

Câu lệnh

try doSomething(); // SyntaxError
catch (e) console.log(e);
2 bao gồm một khối
try doSomething(); // SyntaxError
catch (e) console.log(e);
3 và khối
try doSomething(); // SyntaxError
catch (e) console.log(e);
4, khối
try doSomething(); // SyntaxError
catch (e) console.log(e);
5 hoặc cả hai. Mã trong khối
try doSomething(); // SyntaxError
catch (e) console.log(e);
3 được thực thi trước và nếu nó ném một ngoại lệ, mã trong khối
try doSomething(); // SyntaxError
catch (e) console.log(e);
4 sẽ được thực thi. Mã trong khối
try doSomething(); // SyntaxError
catch (e) console.log(e);
5 sẽ luôn được thực thi trước khi luồng điều khiển thoát ra toàn bộ cấu trúc.
try doSomething(); // SyntaxError
catch (e) console.log(e);
2
statement is comprised of a
try doSomething(); // SyntaxError
catch (e) console.log(e);
3 block and either a
try doSomething(); // SyntaxError
catch (e) console.log(e);
4 block, a
try doSomething(); // SyntaxError
catch (e) console.log(e);
5 block, or both. The code in the
try doSomething(); // SyntaxError
catch (e) console.log(e);
3 block is executed first, and if it throws an exception, the code in the
try doSomething(); // SyntaxError
catch (e) console.log(e);
4 block will be executed. The code in the
try doSomething(); // SyntaxError
catch (e) console.log(e);
5 block will always be executed before control flow exits the entire construct.

Thử nó

Cú pháp

try {
  tryStatements
} catch (exceptionVar) {
  catchStatements
} finally {
  finallyStatements
}

try doSomething(); // SyntaxError
catch (e) console.log(e);
9

Các tuyên bố sẽ được thực thi.

try {
  throw "myException"; // generates an exception
} catch (e) {
  // statements to handle any exceptions
  logMyErrors(e); // pass exception object to error handler
}
0

Tuyên bố được thực thi nếu một ngoại lệ được ném vào khối ____ 13.

try {
  throw "myException"; // generates an exception
} catch (e) {
  // statements to handle any exceptions
  logMyErrors(e); // pass exception object to error handler
}
2 Tùy chọnOptional

Một định danh tùy chọn để giữ ngoại lệ bị bắt cho khối

try doSomething(); // SyntaxError
catch (e) console.log(e);
4 được liên kết. Nếu khối
try doSomething(); // SyntaxError
catch (e) console.log(e);
4 không sử dụng giá trị của ngoại lệ, bạn có thể bỏ qua
try {
  throw "myException"; // generates an exception
} catch (e) {
  // statements to handle any exceptions
  logMyErrors(e); // pass exception object to error handler
}
2 và dấu ngoặc đơn xung quanh của nó, là
try {
  throw "myException"; // generates an exception
} catch (e) {
  // statements to handle any exceptions
  logMyErrors(e); // pass exception object to error handler
}
6.

try {
  throw "myException"; // generates an exception
} catch (e) {
  // statements to handle any exceptions
  logMyErrors(e); // pass exception object to error handler
}
7

Các câu lệnh được thực thi trước khi luồng điều khiển thoát khỏi cấu trúc

try {
  throw "myException"; // generates an exception
} catch (e) {
  // statements to handle any exceptions
  logMyErrors(e); // pass exception object to error handler
}
8. Những tuyên bố này thực hiện bất kể một ngoại lệ đã bị ném hay bị bắt.

Sự mô tả

Câu lệnh

try doSomething(); // SyntaxError
catch (e) console.log(e);
3 luôn bắt đầu với khối
try doSomething(); // SyntaxError
catch (e) console.log(e);
3. Sau đó, một khối
try doSomething(); // SyntaxError
catch (e) console.log(e);
4 hoặc một khối
try doSomething(); // SyntaxError
catch (e) console.log(e);
5 phải có mặt. Cũng có thể có cả các khối
try doSomething(); // SyntaxError
catch (e) console.log(e);
4 và
try doSomething(); // SyntaxError
catch (e) console.log(e);
5. Điều này cung cấp cho chúng tôi ba biểu mẫu cho tuyên bố
try doSomething(); // SyntaxError
catch (e) console.log(e);
3:

  • try doSomething(); // SyntaxError
    catch (e) console.log(e);
    
    2
  • try {
      myroutine(); // may throw three types of exceptions
    } catch (e) {
      if (e instanceof TypeError) {
        // statements to handle TypeError exceptions
      } else if (e instanceof RangeError) {
        // statements to handle RangeError exceptions
      } else if (e instanceof EvalError) {
        // statements to handle EvalError exceptions
      } else {
        // statements to handle any unspecified exceptions
        logMyErrors(e); // pass exception object to error handler
      }
    }
    
    7
  • try {
      throw "myException"; // generates an exception
    } catch (e) {
      // statements to handle any exceptions
      logMyErrors(e); // pass exception object to error handler
    }
    
    8

Không giống như các cấu trúc khác như

try {
  myroutine(); // may throw three types of exceptions
} catch (e) {
  if (e instanceof TypeError) {
    // statements to handle TypeError exceptions
  } else if (e instanceof RangeError) {
    // statements to handle RangeError exceptions
  } else if (e instanceof EvalError) {
    // statements to handle EvalError exceptions
  } else {
    // statements to handle any unspecified exceptions
    logMyErrors(e); // pass exception object to error handler
  }
}
9 hoặc
try {
  myRoutine();
} catch (e) {
  if (e instanceof RangeError) {
    // statements to handle this very common expected error
  } else {
    throw e; // re-throw the error unchanged
  }
}
0, các khối
try doSomething(); // SyntaxError
catch (e) console.log(e);
3,
try doSomething(); // SyntaxError
catch (e) console.log(e);
4 và
try doSomething(); // SyntaxError
catch (e) console.log(e);
5 phải là các khối, thay vì các câu lệnh đơn.

try doSomething(); // SyntaxError
catch (e) console.log(e);

Một khối ____ 14 chứa các câu lệnh chỉ định phải làm gì nếu một ngoại lệ được ném vào khối ____ 13. Nếu bất kỳ câu lệnh nào trong khối ____ 13 (hoặc trong một hàm được gọi từ trong ____ 13 khối) ném một ngoại lệ, điều khiển sẽ được chuyển ngay sang khối ____ 14. Nếu không có ngoại lệ nào được ném vào khối ____ 13, ____ 14 khối được bỏ qua.

Khối

try doSomething(); // SyntaxError
catch (e) console.log(e);
5 sẽ luôn thực hiện trước khi luồng điều khiển thoát khỏi cấu trúc
try {
  throw "myException"; // generates an exception
} catch (e) {
  // statements to handle any exceptions
  logMyErrors(e); // pass exception object to error handler
}
8. Nó luôn luôn thực thi, bất kể một ngoại lệ đã bị ném hay bị bắt.

Bạn có thể làm tổ một hoặc nhiều câu lệnh

try doSomething(); // SyntaxError
catch (e) console.log(e);
3. Nếu câu lệnh
try doSomething(); // SyntaxError
catch (e) console.log(e);
3 bên trong không có khối ____ 14, thì câu lệnh ________ 14 của câu lệnh
try doSomething(); // SyntaxError
catch (e) console.log(e);
3 được sử dụng thay thế.

Bạn cũng có thể sử dụng câu lệnh

try doSomething(); // SyntaxError
catch (e) console.log(e);
3 để xử lý các ngoại lệ JavaScript. Xem Hướng dẫn JavaScript để biết thêm thông tin về ngoại lệ JavaScript.

Khối bắt vô điều kiện

Khi sử dụng khối ____ 14, khối ____ 14 được thực hiện khi bất kỳ ngoại lệ nào được ném từ trong khối ____ 13 khối. Ví dụ: khi ngoại lệ xảy ra trong mã sau, điều khiển chuyển sang khối 14 ____.

try {
  throw "myException"; // generates an exception
} catch (e) {
  // statements to handle any exceptions
  logMyErrors(e); // pass exception object to error handler
}

____ 14 khối chỉ định một định danh (

openMyFile();
try {
  // tie up a resource
  writeMyFile(theData);
} finally {
  closeMyFile(); // always close the resource
}
4 trong ví dụ trên) giữ giá trị của ngoại lệ; Giá trị này chỉ có sẵn trong phạm vi của khối 14 ____.

Khối lượng bắt có điều kiện

Bạn có thể tạo "có điều kiện ____ 14 khối" bằng cách kết hợp các khối

try doSomething(); // SyntaxError
catch (e) console.log(e);
2 với các cấu trúc
openMyFile();
try {
  // tie up a resource
  writeMyFile(theData);
} finally {
  closeMyFile(); // always close the resource
}
8, như thế này:

try {
  myroutine(); // may throw three types of exceptions
} catch (e) {
  if (e instanceof TypeError) {
    // statements to handle TypeError exceptions
  } else if (e instanceof RangeError) {
    // statements to handle RangeError exceptions
  } else if (e instanceof EvalError) {
    // statements to handle EvalError exceptions
  } else {
    // statements to handle any unspecified exceptions
    logMyErrors(e); // pass exception object to error handler
  }
}

Một trường hợp sử dụng phổ biến cho điều này là chỉ bắt (và im lặng) một tập hợp nhỏ các lỗi dự kiến, sau đó ném lại lỗi trong các trường hợp khác:

try {
  myRoutine();
} catch (e) {
  if (e instanceof RangeError) {
    // statements to handle this very common expected error
  } else {
    throw e; // re-throw the error unchanged
  }
}

Định danh ngoại lệ

Khi một ngoại lệ được ném vào ____ 13 khối,

function doIt() {
  try {
    return 1;
  } finally {
    return 2;
  }
}

doIt(); // returns 2
0 (tức là,
openMyFile();
try {
  // tie up a resource
  writeMyFile(theData);
} finally {
  closeMyFile(); // always close the resource
}
4 trong
function doIt() {
  try {
    return 1;
  } finally {
    return 2;
  }
}

doIt(); // returns 2
2) giữ giá trị ngoại lệ. Bạn có thể sử dụng định danh này để có được thông tin về ngoại lệ đã bị ném. Mã định danh này chỉ có sẵn trong phạm vi của ____ 14 khối. Nếu bạn không cần giá trị ngoại lệ, nó có thể bị bỏ qua.

function isValidJSON(text) {
  try {
    JSON.parse(text);
    return true;
  } catch {
    return false;
  }
}

Khối cuối cùng

Khối

try doSomething(); // SyntaxError
catch (e) console.log(e);
5 chứa các câu lệnh để thực thi sau khối
try doSomething(); // SyntaxError
catch (e) console.log(e);
3 và khối
try doSomething(); // SyntaxError
catch (e) console.log(e);
4 thực thi, nhưng trước các câu lệnh theo khối
try {
  throw "myException"; // generates an exception
} catch (e) {
  // statements to handle any exceptions
  logMyErrors(e); // pass exception object to error handler
}
8. Luồng điều khiển sẽ luôn vào khối
try doSomething(); // SyntaxError
catch (e) console.log(e);
5, có thể tiến hành theo một trong các cách sau:

  • Ngay trước khi khối
    try doSomething(); // SyntaxError
    catch (e) console.log(e);
    
    3 hoàn thành thực thi bình thường (và không có ngoại lệ nào được ném);
  • Ngay trước khi khối
    try doSomething(); // SyntaxError
    catch (e) console.log(e);
    
    4 hoàn thành thực thi bình thường;
  • Ngay trước khi tuyên bố dòng điều khiển (
    try {
      try {
        throw new Error("oops");
      } finally {
        console.log("finally");
      }
    } catch (ex) {
      console.error("outer", ex.message);
    }
    
    // Output:
    // "finally"
    // "outer" "oops"
    
    1,
    try {
      try {
        throw new Error("oops");
      } finally {
        console.log("finally");
      }
    } catch (ex) {
      console.error("outer", ex.message);
    }
    
    // Output:
    // "finally"
    // "outer" "oops"
    
    2,
    try {
      try {
        throw new Error("oops");
      } finally {
        console.log("finally");
      }
    } catch (ex) {
      console.error("outer", ex.message);
    }
    
    // Output:
    // "finally"
    // "outer" "oops"
    
    3,
    try {
      try {
        throw new Error("oops");
      } finally {
        console.log("finally");
      }
    } catch (ex) {
      console.error("outer", ex.message);
    }
    
    // Output:
    // "finally"
    // "outer" "oops"
    
    4) được thực thi trong khối
    try doSomething(); // SyntaxError
    catch (e) console.log(e);
    
    3 hoặc
    try doSomething(); // SyntaxError
    catch (e) console.log(e);
    
    4.

Nếu một ngoại lệ được ném từ khối

try doSomething(); // SyntaxError
catch (e) console.log(e);
3, ngay cả khi không có khối
try doSomething(); // SyntaxError
catch (e) console.log(e);
4 để xử lý ngoại lệ, khối
try doSomething(); // SyntaxError
catch (e) console.log(e);
5 vẫn thực thi, trong trường hợp đó, ngoại lệ vẫn được ném ngay sau khi khối
try doSomething(); // SyntaxError
catch (e) console.log(e);
5 hoàn thành thực thi.

Ví dụ sau đây cho thấy một trường hợp sử dụng cho ____ 15 khối. Mã mở một tệp và sau đó thực thi các câu lệnh sử dụng tệp; Khối 15 ____ đảm bảo rằng tệp luôn đóng sau khi nó được sử dụng ngay cả khi một ngoại lệ được ném.

openMyFile();
try {
  // tie up a resource
  writeMyFile(theData);
} finally {
  closeMyFile(); // always close the resource
}

Kiểm soát các báo cáo dòng chảy (

try {
  try {
    throw new Error("oops");
  } finally {
    console.log("finally");
  }
} catch (ex) {
  console.error("outer", ex.message);
}

// Output:
// "finally"
// "outer" "oops"
1,
try {
  try {
    throw new Error("oops");
  } finally {
    console.log("finally");
  }
} catch (ex) {
  console.error("outer", ex.message);
}

// Output:
// "finally"
// "outer" "oops"
2,
try {
  try {
    throw new Error("oops");
  } finally {
    console.log("finally");
  }
} catch (ex) {
  console.error("outer", ex.message);
}

// Output:
// "finally"
// "outer" "oops"
3,
try {
  try {
    throw new Error("oops");
  } finally {
    console.log("finally");
  }
} catch (ex) {
  console.error("outer", ex.message);
}

// Output:
// "finally"
// "outer" "oops"
4) trong khối
try doSomething(); // SyntaxError
catch (e) console.log(e);
5 sẽ "che dấu" bất kỳ giá trị hoàn thành nào của khối
try doSomething(); // SyntaxError
catch (e) console.log(e);
3 hoặc khối
try doSomething(); // SyntaxError
catch (e) console.log(e);
4. Trong ví dụ này, khối
try doSomething(); // SyntaxError
catch (e) console.log(e);
3 cố gắng trả về 1, nhưng trước khi quay lại, luồng điều khiển được mang lại cho khối
try doSomething(); // SyntaxError
catch (e) console.log(e);
5 trước, do đó, giá trị trả về của khối
try doSomething(); // SyntaxError
catch (e) console.log(e);
5 được trả về thay thế.

function doIt() {
  try {
    return 1;
  } finally {
    return 2;
  }
}

doIt(); // returns 2

Nói chung, một ý tưởng tồi là có các câu lệnh điều khiển trong khối

try doSomething(); // SyntaxError
catch (e) console.log(e);
5. Chỉ sử dụng nó cho mã dọn dẹp.

Ví dụ

Các khối cố gắng lồng nhau

Đầu tiên, hãy xem điều gì xảy ra với điều này:

try {
  try {
    throw new Error("oops");
  } finally {
    console.log("finally");
  }
} catch (ex) {
  console.error("outer", ex.message);
}

// Output:
// "finally"
// "outer" "oops"

Bây giờ, nếu chúng ta đã bắt được ngoại lệ ở bên trong ____ 13 khối bằng cách thêm ____ 14 khối:

try {
  try {
    throw new Error("oops");
  } catch (ex) {
    console.error("inner", ex.message);
  } finally {
    console.log("finally");
  }
} catch (ex) {
  console.error("outer", ex.message);
}

// Output:
// "inner" "oops"
// "finally"

Và bây giờ, chúng ta hãy xác nhận lỗi.

try doSomething(); // SyntaxError
catch (e) console.log(e);
0

Bất kỳ ngoại lệ nhất định sẽ chỉ bị bắt một lần bởi ____ 14 khối gần nhất trừ khi nó được rethrown. Tất nhiên, bất kỳ ngoại lệ mới nào được nêu trong khối "bên trong" (vì mã trong ____ 14 khối có thể làm một cái gì đó ném), sẽ bị chặn bởi khối "bên ngoài".

Trở về từ một khối cuối cùng

Nếu ________ 15 khối trả về giá trị, giá trị này sẽ trở thành giá trị trả về của toàn bộ câu lệnh

try doSomething(); // SyntaxError
catch (e) console.log(e);
09, bất kể bất kỳ câu lệnh
try {
  try {
    throw new Error("oops");
  } finally {
    console.log("finally");
  }
} catch (ex) {
  console.error("outer", ex.message);
}

// Output:
// "finally"
// "outer" "oops"
1 nào trong
try doSomething(); // SyntaxError
catch (e) console.log(e);
3 và ________ 14 khối. Điều này bao gồm các trường hợp ngoại lệ được ném vào bên trong ____ 14 khối:

try doSomething(); // SyntaxError
catch (e) console.log(e);
1

"OOPS" bên ngoài không bị ném vì sự trở lại trong khối 15 ____. Điều tương tự sẽ áp dụng cho bất kỳ giá trị nào được trả lại từ khối 14 ____.

Thông số kỹ thuật

Sự chỉ rõ
Thông số kỹ thuật ngôn ngữ Ecmascript # Sec-try-Statement
# sec-try-statement

Tính tương thích của trình duyệt web

Bảng BCD chỉ tải trong trình duyệt

Xem thêm

Đang sử dụng thử Catch Good?

Không cần thử, bạn có nguy cơ gặp phải ngoại lệ chưa được xử lý.Hãy thử các câu lệnh bắt không miễn phí ở chỗ chúng đi kèm với chi phí hiệu suất.Giống như bất kỳ tính năng ngôn ngữ nào, thử bắt bắt có thể được sử dụng quá mức.

Nên thử bắt được tránh được?

Khi nào bạn nên tránh sử dụng thử nghiệm?Nếu bạn biết một lỗi có khả năng xảy ra, bạn không nên sử dụng câu lệnh TRY-Catch vì bạn muốn gỡ lỗi vấn đề hơn là ngụy trang nó.If you know an error is likely to happen, you shouldn't use the try-catch statement since you'd rather debug the problem than disguise it.

Là tốt hơn để sử dụng nếu khác hoặc thử bắt?

Nói chung, các khối thử thử rất tuyệt vời vì chúng sẽ phá vỡ (chuyển sang câu lệnh bắt) bất cứ khi nào ngoại lệ xảy ra. Các khối else dựa trên bạn dự đoán khi lỗi sẽ xảy ra.Chỉnh sửa: Ngoài ra, các khối bắt sẽ không ngăn được mã của bạn tạm dừng khi bị lỗi.try-catch blocks are great because they will break (move to the catch statement) whenever the exception occurs. If-else blocks rely on you predicting when the error will happen. Edit: Also, catch blocks won't stop your code from halting when an error is hit.