Làm cách nào để xử lý các ngoại lệ trong MySQL trong PHP?

Tóm lược. trong hướng dẫn này, bạn sẽ học cách sử dụng trình xử lý MySQL để xử lý các lỗi gặp phải trong thủ tục lưu trữ

Khi xảy ra lỗi bên trong một thủ tục được lưu trữ, điều quan trọng là phải xử lý nó một cách thích hợp, chẳng hạn như tiếp tục hoặc thoát khỏi quá trình thực thi khối mã hiện tại và đưa ra một thông báo lỗi có ý nghĩa

MySQL cung cấp một cách dễ dàng để định nghĩa các trình xử lý xử lý từ các điều kiện chung như cảnh báo hoặc ngoại lệ đến các điều kiện cụ thể e. g. , mã lỗi cụ thể

Khai báo một handler

Để khai báo một trình xử lý, bạn sử dụng câu lệnh 

DECLARE EXIT HANDLER FOR SQLEXCEPTION BEGIN ROLLBACK; SELECT 'An error has occurred, operation rollbacked and the stored procedure was terminated'; END;

Code language: SQL [Structured Query Language] [sql]
2 như sau

DECLARE action HANDLER FOR condition_value statement;

Code language: SQL [Structured Query Language] [sql]

Nếu một điều kiện có giá trị khớp với 

DECLARE EXIT HANDLER FOR SQLEXCEPTION BEGIN ROLLBACK; SELECT 'An error has occurred, operation rollbacked and the stored procedure was terminated'; END;

Code language: SQL [Structured Query Language] [sql]
3 , MySQL sẽ thực thi

DECLARE EXIT HANDLER FOR SQLEXCEPTION BEGIN ROLLBACK; SELECT 'An error has occurred, operation rollbacked and the stored procedure was terminated'; END;

Code language: SQL [Structured Query Language] [sql]
4 và tiếp tục hoặc thoát khỏi khối mã hiện tại dựa trên

DECLARE EXIT HANDLER FOR SQLEXCEPTION BEGIN ROLLBACK; SELECT 'An error has occurred, operation rollbacked and the stored procedure was terminated'; END;

Code language: SQL [Structured Query Language] [sql]
5

DECLARE EXIT HANDLER FOR SQLEXCEPTION BEGIN ROLLBACK; SELECT 'An error has occurred, operation rollbacked and the stored procedure was terminated'; END;

Code language: SQL [Structured Query Language] [sql]
5 chấp nhận một trong các giá trị sau

  • DECLARE EXIT HANDLER FOR SQLEXCEPTION BEGIN ROLLBACK; SELECT 'An error has occurred, operation rollbacked and the stored procedure was terminated'; END;

    Code language: SQL [Structured Query Language] [sql]
    7. việc thực thi khối mã kèm theo [

    DECLARE EXIT HANDLER FOR SQLEXCEPTION BEGIN ROLLBACK; SELECT 'An error has occurred, operation rollbacked and the stored procedure was terminated'; END;

    Code language: SQL [Structured Query Language] [sql]
    8 …

    DECLARE EXIT HANDLER FOR SQLEXCEPTION BEGIN ROLLBACK; SELECT 'An error has occurred, operation rollbacked and the stored procedure was terminated'; END;

    Code language: SQL [Structured Query Language] [sql]
    9 ] vẫn tiếp tục
  • DECLARE CONTINUE HANDLER FOR NOT FOUND SET RowNotFound = 1;

    Code language: SQL [Structured Query Language] [sql]
    0. việc thực thi khối mã kèm theo, nơi trình xử lý được khai báo, chấm dứt

DECLARE EXIT HANDLER FOR SQLEXCEPTION BEGIN ROLLBACK; SELECT 'An error has occurred, operation rollbacked and the stored procedure was terminated'; END;

Code language: SQL [Structured Query Language] [sql]
3 chỉ định một điều kiện cụ thể hoặc một nhóm điều kiện kích hoạt trình xử lý.

DECLARE EXIT HANDLER FOR SQLEXCEPTION BEGIN ROLLBACK; SELECT 'An error has occurred, operation rollbacked and the stored procedure was terminated'; END;

Code language: SQL [Structured Query Language] [sql]
3 chấp nhận một trong các giá trị sau

  • Mã lỗi MySQL
  • Một giá trị

    DECLARE CONTINUE HANDLER FOR NOT FOUND SET RowNotFound = 1;

    Code language: SQL [Structured Query Language] [sql]
    3 tiêu chuẩn. Hoặc nó có thể là một điều kiện

    DECLARE CONTINUE HANDLER FOR NOT FOUND SET RowNotFound = 1;

    Code language: SQL [Structured Query Language] [sql]
    4 ,

    DECLARE CONTINUE HANDLER FOR NOT FOUND SET RowNotFound = 1;

    Code language: SQL [Structured Query Language] [sql]
    5 hoặc

    DECLARE CONTINUE HANDLER FOR NOT FOUND SET RowNotFound = 1;

    Code language: SQL [Structured Query Language] [sql]
    6, là cách viết tắt của loại giá trị

    DECLARE CONTINUE HANDLER FOR NOT FOUND SET RowNotFound = 1;

    Code language: SQL [Structured Query Language] [sql]
    3. Điều kiện

    DECLARE CONTINUE HANDLER FOR NOT FOUND SET RowNotFound = 1;

    Code language: SQL [Structured Query Language] [sql]
    5 được sử dụng cho một con trỏ hoặc câu lệnh 

    DECLARE CONTINUE HANDLER FOR NOT FOUND SET RowNotFound = 1;

    Code language: SQL [Structured Query Language] [sql]
    9
  • Một điều kiện được đặt tên liên quan đến mã lỗi MySQL hoặc giá trị

    DECLARE CONTINUE HANDLER FOR NOT FOUND SET RowNotFound = 1;

    Code language: SQL [Structured Query Language] [sql]
    3

DECLARE EXIT HANDLER FOR SQLEXCEPTION BEGIN ROLLBACK; SELECT 'An error has occurred, operation rollbacked and the stored procedure was terminated'; END;

Code language: SQL [Structured Query Language] [sql]
4 có thể là một mệnh đề đơn giản hoặc một mệnh đề ghép bao quanh bởi các từ khóa

DECLARE EXIT HANDLER FOR SQLEXCEPTION BEGIN ROLLBACK; SELECT 'An error has occurred, operation rollbacked and the stored procedure was terminated'; END;

Code language: SQL [Structured Query Language] [sql]
8 và

DECLARE EXIT HANDLER FOR SQLEXCEPTION BEGIN ROLLBACK; SELECT 'An error has occurred, operation rollbacked and the stored procedure was terminated'; END;

Code language: SQL [Structured Query Language] [sql]
9

Ví dụ xử lý lỗi MySQL

Hãy lấy một số ví dụ về khai báo trình xử lý

Trình xử lý sau đây đặt giá trị của biến 

DECLARE CONTINUE HANDLER FOR 1062 SELECT 'Error, duplicate key occurred';

Code language: SQL [Structured Query Language] [sql]
4 thành 1 và tiếp tục thực thi nếu xảy ra

DECLARE CONTINUE HANDLER FOR NOT FOUND SET RowNotFound = 1;

Code language: SQL [Structured Query Language] [sql]
6

DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SET hasError = 1;

Code language: SQL [Structured Query Language] [sql]

Trình xử lý sau khôi phục các hoạt động trước đó, đưa ra thông báo lỗi và thoát khỏi khối mã hiện tại trong trường hợp xảy ra lỗi. Nếu bạn khai báo nó bên trong khối

DECLARE CONTINUE HANDLER FOR 1062 SELECT 'Error, duplicate key occurred';

Code language: SQL [Structured Query Language] [sql]
6 của thủ tục được lưu trữ, nó sẽ chấm dứt thủ tục được lưu trữ ngay lập tức

DECLARE EXIT HANDLER FOR SQLEXCEPTION BEGIN ROLLBACK; SELECT 'An error has occurred, operation rollbacked and the stored procedure was terminated'; END;

Code language: SQL [Structured Query Language] [sql]

Trình xử lý sau đặt giá trị của biến 

DECLARE CONTINUE HANDLER FOR 1062 SELECT 'Error, duplicate key occurred';

Code language: SQL [Structured Query Language] [sql]
7 thành 1 và tiếp tục thực thi nếu không còn hàng để tìm nạp trong trường hợp con trỏ hoặc câu lệnh

DECLARE CONTINUE HANDLER FOR 1062 SELECT 'Error, duplicate key occurred';

Code language: SQL [Structured Query Language] [sql]
8

DECLARE CONTINUE HANDLER FOR NOT FOUND SET RowNotFound = 1;

Code language: SQL [Structured Query Language] [sql]

Nếu xảy ra lỗi khóa trùng lặp, trình xử lý sau sẽ đưa ra thông báo lỗi và tiếp tục thực hiện

DECLARE CONTINUE HANDLER FOR 1062 SELECT 'Error, duplicate key occurred';

Code language: SQL [Structured Query Language] [sql]

Ví dụ về trình xử lý MySQL trong thủ tục lưu sẵn

Đầu tiên, tạo một bảng mới có tên là

DECLARE CONTINUE HANDLER FOR 1062 SELECT 'Error, duplicate key occurred';

Code language: SQL [Structured Query Language] [sql]
9để trình diễn

CREATE TABLE SupplierProducts [ supplierId INT, productId INT, PRIMARY KEY [supplierId , productId] ];

Code language: SQL [Structured Query Language] [sql]

Bảng

DECLARE CONTINUE HANDLER FOR 1062 SELECT 'Error, duplicate key occurred';

Code language: SQL [Structured Query Language] [sql]
9 lưu trữ các mối quan hệ giữa các nhà cung cấp và sản phẩm của bảng. Mỗi nhà cung cấp có thể cung cấp nhiều sản phẩm và mỗi sản phẩm có thể được cung cấp bởi nhiều nhà cung cấp. Để đơn giản, chúng tôi không tạo các bảng

CREATE TABLE SupplierProducts [ supplierId INT, productId INT, PRIMARY KEY [supplierId , productId] ];

Code language: SQL [Structured Query Language] [sql]
1 và

CREATE TABLE SupplierProducts [ supplierId INT, productId INT, PRIMARY KEY [supplierId , productId] ];

Code language: SQL [Structured Query Language] [sql]
2, cũng như các khóa ngoại trong bảng 

DECLARE CONTINUE HANDLER FOR 1062 SELECT 'Error, duplicate key occurred';

Code language: SQL [Structured Query Language] [sql]
9

Thứ hai, tạo một thủ tục được lưu trữ để chèn id sản phẩm và id nhà cung cấp vào bảng

DECLARE CONTINUE HANDLER FOR 1062 SELECT 'Error, duplicate key occurred';

Code language: SQL [Structured Query Language] [sql]
9

CREATE PROCEDURE InsertSupplierProduct[ IN inSupplierId INT, IN inProductId INT ] BEGIN -- exit if the duplicate key occurs DECLARE EXIT HANDLER FOR 1062 BEGIN SELECT CONCAT['Duplicate key [',inSupplierId,',',inProductId,'] occurred'] AS message; END; -- insert a new row into the SupplierProducts INSERT INTO SupplierProducts[supplierId,productId] VALUES[inSupplierId,inProductId]; -- return the products supplied by the supplier id SELECT COUNT[*] FROM SupplierProducts WHERE supplierId = inSupplierId; END$$ DELIMITER ;

Code language: SQL [Structured Query Language] [sql]

Làm thế nào nó hoạt động

Trình xử lý thoát sau đây chấm dứt thủ tục được lưu trữ bất cứ khi nào xảy ra khóa trùng lặp [với mã 1062]. Ngoài ra, nó trả về một thông báo lỗi

DECLARE EXIT HANDLER FOR 1062 BEGIN SELECT CONCAT['Duplicate key [',supplierId,',',productId,'] occurred'] AS message; END;

Code language: SQL [Structured Query Language] [sql]

Câu lệnh này chèn một hàng vào bảng

DECLARE CONTINUE HANDLER FOR 1062 SELECT 'Error, duplicate key occurred';

Code language: SQL [Structured Query Language] [sql]
9. Nếu khóa trùng lặp xảy ra, mã trong phần xử lý sẽ thực thi

INSERT INTO SupplierProducts[supplierId,productId] VALUES[supplierId,productId];

Code language: SQL [Structured Query Language] [sql]

Thứ ba, gọi

CREATE TABLE SupplierProducts [ supplierId INT, productId INT, PRIMARY KEY [supplierId , productId] ];

Code language: SQL [Structured Query Language] [sql]
6 để chèn một số hàng vào bảng

DECLARE CONTINUE HANDLER FOR 1062 SELECT 'Error, duplicate key occurred';

Code language: SQL [Structured Query Language] [sql]
9

CALL InsertSupplierProduct[1,1]; CALL InsertSupplierProduct[1,2]; CALL InsertSupplierProduct[1,3];

Code language: SQL [Structured Query Language] [sql]

Thứ tư, cố gắng chèn một hàng có giá trị đã tồn tại trong bảng

DECLARE CONTINUE HANDLER FOR 1062 SELECT 'Error, duplicate key occurred';

Code language: SQL [Structured Query Language] [sql]
9

DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SET hasError = 1;

Code language: SQL [Structured Query Language] [sql]
0

Đây là thông báo lỗi

DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SET hasError = 1;

Code language: SQL [Structured Query Language] [sql]
1

Vì trình xử lý là trình xử lý

DECLARE CONTINUE HANDLER FOR NOT FOUND SET RowNotFound = 1;

Code language: SQL [Structured Query Language] [sql]
0 nên câu lệnh cuối cùng không thực thi

DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SET hasError = 1;

Code language: SQL [Structured Query Language] [sql]
2

Nếu bạn thay đổi

DECLARE CONTINUE HANDLER FOR NOT FOUND SET RowNotFound = 1;

Code language: SQL [Structured Query Language] [sql]
0 trong phần khai báo của nhà xử lý thành

DECLARE EXIT HANDLER FOR SQLEXCEPTION BEGIN ROLLBACK; SELECT 'An error has occurred, operation rollbacked and the stored procedure was terminated'; END;

Code language: SQL [Structured Query Language] [sql]
7, thì bạn cũng sẽ nhận được số lượng sản phẩm do nhà cung cấp cung cấp

DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SET hasError = 1;

Code language: SQL [Structured Query Language] [sql]
3

Cuối cùng, gọi lại thủ tục lưu sẵn để xem tác dụng của trình xử lý

DECLARE EXIT HANDLER FOR SQLEXCEPTION BEGIN ROLLBACK; SELECT 'An error has occurred, operation rollbacked and the stored procedure was terminated'; END;

Code language: SQL [Structured Query Language] [sql]
7

DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SET hasError = 1;

Code language: SQL [Structured Query Language] [sql]
0

Đây là đầu ra

DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SET hasError = 1;

Code language: SQL [Structured Query Language] [sql]
5

Ưu tiên xử lý MySQL

Trong trường hợp bạn có nhiều trình xử lý xử lý cùng một lỗi, MySQL sẽ gọi trình xử lý cụ thể nhất để xử lý lỗi trước dựa trên các quy tắc sau

  • Một lỗi luôn ánh xạ tới mã lỗi MySQL vì trong MySQL, nó là mã cụ thể nhất
  • Một

    DECLARE CONTINUE HANDLER FOR NOT FOUND SET RowNotFound = 1;

    Code language: SQL [Structured Query Language] [sql]
    3 có thể ánh xạ tới nhiều mã lỗi MySQL, do đó, nó ít cụ thể hơn
  • Một

    CREATE PROCEDURE InsertSupplierProduct[ IN inSupplierId INT, IN inProductId INT ] BEGIN -- exit if the duplicate key occurs DECLARE EXIT HANDLER FOR 1062 BEGIN SELECT CONCAT['Duplicate key [',inSupplierId,',',inProductId,'] occurred'] AS message; END; -- insert a new row into the SupplierProducts INSERT INTO SupplierProducts[supplierId,productId] VALUES[inSupplierId,inProductId]; -- return the products supplied by the supplier id SELECT COUNT[*] FROM SupplierProducts WHERE supplierId = inSupplierId; END$$ DELIMITER ;

    Code language: SQL [Structured Query Language] [sql]
    4 hoặc một

    DECLARE CONTINUE HANDLER FOR NOT FOUND SET RowNotFound = 1;

    Code language: SQL [Structured Query Language] [sql]
    4 là cách viết tắt của một lớp gồm các giá trị

    CREATE PROCEDURE InsertSupplierProduct[ IN inSupplierId INT, IN inProductId INT ] BEGIN -- exit if the duplicate key occurs DECLARE EXIT HANDLER FOR 1062 BEGIN SELECT CONCAT['Duplicate key [',inSupplierId,',',inProductId,'] occurred'] AS message; END; -- insert a new row into the SupplierProducts INSERT INTO SupplierProducts[supplierId,productId] VALUES[inSupplierId,inProductId]; -- return the products supplied by the supplier id SELECT COUNT[*] FROM SupplierProducts WHERE supplierId = inSupplierId; END$$ DELIMITER ;

    Code language: SQL [Structured Query Language] [sql]
    6 vì vậy nó là loại chung nhất

Dựa trên các quy tắc về mức độ ưu tiên của trình xử lý,  trình xử lý mã lỗi MySQL, trình xử lý

DECLARE CONTINUE HANDLER FOR NOT FOUND SET RowNotFound = 1;

Code language: SQL [Structured Query Language] [sql]
3 và

DECLARE CONTINUE HANDLER FOR NOT FOUND SET RowNotFound = 1;

Code language: SQL [Structured Query Language] [sql]
6 có mức độ ưu tiên thứ nhất, thứ hai và thứ ba

Giả sử rằng chúng ta có ba trình xử lý trong các trình xử lý trong thủ tục lưu sẵn

CREATE PROCEDURE InsertSupplierProduct[ IN inSupplierId INT, IN inProductId INT ] BEGIN -- exit if the duplicate key occurs DECLARE EXIT HANDLER FOR 1062 BEGIN SELECT CONCAT['Duplicate key [',inSupplierId,',',inProductId,'] occurred'] AS message; END; -- insert a new row into the SupplierProducts INSERT INTO SupplierProducts[supplierId,productId] VALUES[inSupplierId,inProductId]; -- return the products supplied by the supplier id SELECT COUNT[*] FROM SupplierProducts WHERE supplierId = inSupplierId; END$$ DELIMITER ;

Code language: SQL [Structured Query Language] [sql]
9

DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SET hasError = 1;

Code language: SQL [Structured Query Language] [sql]
6

Gọi thủ tục được lưu trữ để chèn khóa trùng lặp

DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SET hasError = 1;

Code language: SQL [Structured Query Language] [sql]
0

Đây là đầu ra

DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SET hasError = 1;

Code language: SQL [Structured Query Language] [sql]
8

Như bạn thấy trình xử lý mã lỗi MySQL được gọi là

Sử dụng một điều kiện lỗi được đặt tên

Hãy bắt đầu với một khai báo trình xử lý lỗi

DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SET hasError = 1;

Code language: SQL [Structured Query Language] [sql]
9

Số

DECLARE EXIT HANDLER FOR 1062 BEGIN SELECT CONCAT['Duplicate key [',supplierId,',',productId,'] occurred'] AS message; END;

Code language: SQL [Structured Query Language] [sql]
0 thực sự có ý nghĩa gì?

May mắn thay, MySQL cung cấp cho bạn câu lệnh

DECLARE EXIT HANDLER FOR 1062 BEGIN SELECT CONCAT['Duplicate key [',supplierId,',',productId,'] occurred'] AS message; END;

Code language: SQL [Structured Query Language] [sql]
1 tuyên bố một điều kiện lỗi được đặt tên, kết hợp với một điều kiện

Đây là cú pháp của câu lệnh

DECLARE EXIT HANDLER FOR 1062 BEGIN SELECT CONCAT['Duplicate key [',supplierId,',',productId,'] occurred'] AS message; END;

Code language: SQL [Structured Query Language] [sql]
1

DECLARE EXIT HANDLER FOR SQLEXCEPTION BEGIN ROLLBACK; SELECT 'An error has occurred, operation rollbacked and the stored procedure was terminated'; END;

Code language: SQL [Structured Query Language] [sql]
0

DECLARE EXIT HANDLER FOR SQLEXCEPTION BEGIN ROLLBACK; SELECT 'An error has occurred, operation rollbacked and the stored procedure was terminated'; END;

Code language: SQL [Structured Query Language] [sql]
3  có thể là mã lỗi MySQL chẳng hạn như

DECLARE EXIT HANDLER FOR 1062 BEGIN SELECT CONCAT['Duplicate key [',supplierId,',',productId,'] occurred'] AS message; END;

Code language: SQL [Structured Query Language] [sql]
0 hoặc giá trị

DECLARE CONTINUE HANDLER FOR NOT FOUND SET RowNotFound = 1;

Code language: SQL [Structured Query Language] [sql]
3.

DECLARE EXIT HANDLER FOR SQLEXCEPTION BEGIN ROLLBACK; SELECT 'An error has occurred, operation rollbacked and the stored procedure was terminated'; END;

Code language: SQL [Structured Query Language] [sql]
3 được đại diện bởi

DECLARE EXIT HANDLER FOR 1062 BEGIN SELECT CONCAT['Duplicate key [',supplierId,',',productId,'] occurred'] AS message; END;

Code language: SQL [Structured Query Language] [sql]
7

Sau khi khai báo, bạn có thể tham khảo

DECLARE EXIT HANDLER FOR 1062 BEGIN SELECT CONCAT['Duplicate key [',supplierId,',',productId,'] occurred'] AS message; END;

Code language: SQL [Structured Query Language] [sql]
7 thay vì

DECLARE EXIT HANDLER FOR SQLEXCEPTION BEGIN ROLLBACK; SELECT 'An error has occurred, operation rollbacked and the stored procedure was terminated'; END;

Code language: SQL [Structured Query Language] [sql]
3

Vì vậy, bạn có thể viết lại đoạn mã trên như sau

DECLARE EXIT HANDLER FOR SQLEXCEPTION BEGIN ROLLBACK; SELECT 'An error has occurred, operation rollbacked and the stored procedure was terminated'; END;

Code language: SQL [Structured Query Language] [sql]
1

Như bạn có thể thấy, mã này rõ ràng và dễ đọc hơn mã trước đó. Lưu ý rằng khai báo điều kiện phải xuất hiện trước khai báo bộ xử lý hoặc con trỏ

Trong hướng dẫn này, bạn đã học cách sử dụng trình xử lý MySQL để xử lý ngoại lệ hoặc lỗi xảy ra trong thủ tục lưu trữ

Làm cách nào để xử lý ngoại lệ SQL trong PHP?

Thử, ném và bắt .
try - Hàm sử dụng ngoại lệ phải nằm trong khối "thử". Nếu ngoại lệ không kích hoạt, mã sẽ tiếp tục như bình thường. .
ném - Đây là cách bạn kích hoạt một ngoại lệ. .
catch - Một khối "catch" truy xuất một ngoại lệ và tạo một đối tượng chứa thông tin ngoại lệ

Các ngoại lệ được xử lý như thế nào trong PHP?

Xử lý ngoại lệ là một cơ chế mạnh mẽ của PHP, được sử dụng để xử lý lỗi thời gian chạy [lỗi thời gian chạy được gọi là ngoại lệ]. Vì vậy, dòng chảy bình thường của ứng dụng có thể được duy trì. Mục đích chính của việc sử dụng xử lý ngoại lệ là để duy trì hoạt động bình thường của ứng dụng

Làm cách nào để xử lý lỗi truy vấn MySQL trong PHP?

Để nhận được thông báo lỗi, chúng ta phải sử dụng một hàm khác mysqli_error[] để in thông báo lỗi do cơ sở dữ liệu MySQL trả về sau khi thực hiện truy vấn . Đây là cách in thông báo lỗi. tiếng vang mysqli_error[]; .

Làm cách nào để bắt ngoại lệ cơ sở dữ liệu trong PHP?

PHP xử lý lỗi từ khóa . Từ khóa throw được sử dụng để báo hiệu sự xuất hiện của một ngoại lệ PHP. Bộ thực thi PHP sau đó sẽ cố gắng tìm một câu lệnh bắt để xử lý ngoại lệ . Bắt lấy. Khối mã này sẽ chỉ được gọi nếu có ngoại lệ xảy ra trong khối mã thử.

Chủ Đề