Hướng dẫn từng bước để sử dụng TRY ... CATCH để xử lý lỗi máy chủ SQL

Xác định lỗi mà không làm gián đoạn quá trình thực thi

Câu lệnh TRY… CATCH trong Transact- SQL phát hiện và xử lý các điều kiện lỗi trong các ứng dụng cơ sở dữ liệu của bạn. Tuyên bố này là nền tảng của việc xử lý lỗi SQL Server và là một phần quan trọng trong việc phát triển các ứng dụng cơ sở dữ liệu mạnh mẽ. TRY ... CATCH áp dụng cho SQL Server bắt đầu từ năm 2008, Cơ sở dữ liệu SQL Azure, Kho dữ liệu SQL Azure và Kho dữ liệu song song.

Giới thiệu TRY..CATCH

TRY ... CATCH hoạt động bằng cách cho phép bạn chỉ định hai câu lệnh Transact-SQL: một câu lệnh mà bạn muốn "thử" và một câu lệnh khác dùng để "bắt" bất kỳ lỗi nào có thể phát sinh. Khi SQL Server gặp TRY ... câu lệnh CATCH, nó ngay lập tức thực hiện câu lệnh được bao gồm trong mệnh đề TRY. Nếu câu lệnh TRY thực hiện thành công, SQL Server chỉ đơn giản là di chuyển trên. Tuy nhiên, nếu câu lệnh TRY tạo ra lỗi, SQL Server sẽ thực hiện câu lệnh CATCH để xử lý lỗi một cách duyên dáng.

Cú pháp cơ bản có dạng này:

BEGIN TRY {sql_statement | statement_block} END TRY BEGIN CATCH [{sql_statement | statement_block}] END CATCH [; ]

TRY ... Ví dụ CATCH

Dễ hiểu nhất là sử dụng câu lệnh này thông qua việc sử dụng một ví dụ. Hãy tưởng tượng rằng bạn là quản trị viên của cơ sở dữ liệu nguồn nhân lực chứa bảng có tên "Nhân viên", chứa thông tin về từng nhân viên trong tổ chức của bạn. Bảng đó sử dụng số ID nhân viên nguyên làm khóa chính . Bạn có thể cố gắng sử dụng câu lệnh dưới đây để chèn một nhân viên mới vào cơ sở dữ liệu của bạn:

INSERT INTO nhân viên (id, first_name, last_name, phần mở rộng) GIÁ TRỊ (12497, 'Mike', 'Chapple', 4201)

Trong những trường hợp bình thường, câu lệnh này sẽ thêm một hàng vào bảng Employees. Tuy nhiên, nếu một nhân viên có ID 12497 đã tồn tại trong cơ sở dữ liệu, việc chèn hàng sẽ vi phạm ràng buộc khóa chính và dẫn đến lỗi sau:

Msg 2627, Cấp 14, Tiểu bang 1, Vi phạm Dòng 1 của ràng buộc CHÍNH PRIMARY 'PK_employee_id'. Không thể chèn khóa trùng lặp trong đối tượng 'dbo.employees'. Các tuyên bố này đã bị chấm dứt.

Trong khi lỗi này cung cấp cho bạn thông tin bạn cần để khắc phục sự cố, có hai vấn đề với nó. Đầu tiên, thông điệp là khó hiểu. Nó bao gồm mã lỗi, số dòng và thông tin khác không thể hiểu được đối với người dùng trung bình. Thứ hai, và quan trọng hơn, nó gây ra tuyên bố hủy bỏ và có thể gây ra một sự cố ứng dụng.

Cách khác là bọc câu lệnh trong câu lệnh TRY… CATCH, như hình dưới đây:

BEGIN TRY INSERT INTO nhân viên (id, first_name, last_name, phần mở rộng) GIÁ TRỊ (12497, 'Mike', 'Chapple', 4201) END TRY BEGIN CATCH IN 'Lỗi:' + ERROR_MESSAGE (); EXEC msdb.dbo.sp_send_dbmail @profile_name = 'Thư của nhân viên', @recipients = 'hr@foo.com', @body = 'Đã xảy ra lỗi khi tạo hồ sơ nhân viên mới.', @subject = 'Lỗi nhân bản ID nhân viên'; END CATCH

Trong ví dụ này, bất kỳ lỗi nào xảy ra đều được báo cáo cho cả người dùng thực thi lệnh và địa chỉ email hr@foo.com. Lỗi được hiển thị cho người dùng xuất hiện bên dưới:

Lỗi: Vi phạm ràng buộc PRIMARY KEY 'PK_employee_id'. Không thể chèn khóa trùng lặp trong đối tượng 'dbo.employees'. Thư được xếp hàng đợi.

Quan trọng nhất, việc thực hiện ứng dụng tiếp tục bình thường, cho phép lập trình viên xử lý một cách duyên dáng lỗi. Sử dụng lệnh TRY ... CATCH là một cách thanh lịch để chủ động phát hiện và xử lý các lỗi xảy ra trong các ứng dụng cơ sở dữ liệu SQL Server.

Học nhiều hơn nữa

Nếu bạn muốn tìm hiểu thêm về Ngôn ngữ truy vấn có cấu trúc, hãy đọc Giới thiệu về SQL .