Thực hiện xử lý ngoại lệ có cấu trúc

Đã hoàn thành

Bây giờ bạn đã hiểu bản chất của lỗi và xử lý lỗi cơ bản trong T-SQL, đã đến lúc phải xem xét một hình thức xử lý lỗi nâng cao hơn. Xử lý ngoại lệ có cấu trúc được giới thiệu trong SQL Server 2005.

Tại đây, bạn sẽ thấy cách sử dụng và đánh giá các lợi ích và giới hạn của nó, bao gồm khối TRY CATCH, vai trò của các hàm xử lý lỗi và hiểu sự khác biệt giữa các lỗi bắt được và không thể lấy được. Cuối cùng, bạn sẽ thấy cách quản lý và hiển thị lỗi khi cần thiết.

Lập trình khối TRY/CATCH là gì

Xử lý ngoại lệ có cấu trúc mạnh hơn xử lý lỗi dựa trên biến @@ERROR thống. Nó cho phép bạn ngăn chặn mã bị rác với mã xử lý lỗi và tập trung mã xử lý lỗi đó. Việc tập trung mã xử lý lỗi cũng có nghĩa là bạn có thể tập trung nhiều hơn vào mục đích của mã thay vì xử lý lỗi trong đó.

KHỐI TRY và khối CATCH

Khi sử dụng xử lý ngoại lệ có cấu trúc, mã có thể làm xuất hiện lỗi sẽ được đặt trong khối TRY. Các khối TRY được đặt trong câu lệnh BEGIN TRYvà END TRY .

Nếu xảy ra một lỗi bắt được - hầu hết các lỗi có thể được bắt, điều khiển thực thi di chuyển đến khối CATCH. Khối CATCH là một chuỗi các câu lệnh T-SQL được đặt trong câu lệnh BEGIN CATCHvà END CATCH .

Ghi

Trong khi BEGIN CATCH và END TRY là câu lệnh riêng biệt, BEGIN CATCH phải ngay lập tức làm theo END TRY.

Giới hạn hiện tại

Các ngôn ngữ cấp cao thường cung cấp tính năng dùng thử/bắt/cuối cùng là cấu trúc và thường được sử dụng để phát hành ngầm các tài nguyên. Không có khối FINALLY tương đương trong T-SQL.

Hiểu rõ sự khác biệt giữa các lỗi bắt được và lỗi không thể lấy được

Điều quan trọng là phải nhận ra rằng, trong khi khối TRY/CATCH cho phép bạn bắt được phạm vi lỗi rộng hơn nhiều so với @@ERROR, bạn không thể bắt gặp mọi loại.

Có thể bắt được so với các lỗi không thể khớp

Không phải tất cả các lỗi đều có thể xảy ra do khối TRY/CATCH trong cùng phạm vi tồn tại khối TRY/CATCH. Thông thường, các lỗi không thể bị bắt trong cùng một phạm vi có thể được bắt gặp trong phạm vi xung quanh. Ví dụ: bạn có thể không gặp lỗi trong quy trình lưu trữ có chứa khối TRY/CATCH. Tuy nhiên, bạn có thể gặp lỗi đó trong khối TRY/CATCH trong mã được gọi là quy trình được lưu trữ nơi xảy ra lỗi.

Các lỗi phổ biến không thể phân bổ

Ví dụ phổ biến về lỗi không thể tìm nạp là:

  • Biên dịch các lỗi, chẳng hạn như lỗi cú pháp, ngăn một lô biên dịch.
  • Các vấn đề biên dịch lại mức tuyên bố thường liên quan đến độ phân giải tên bị trì hoãn. Ví dụ: bạn có thể tạo quy trình lưu trữ tham chiếu đến bảng không xác định. Lỗi chỉ được trả về khi thủ tục cố gắng giải quyết tên của bảng thành objectid.

Làm thế nào để rethrow lỗi bằng cách sử dụng THROW

Nếu câu lệnh THROW được sử dụng trong một khối CATCH mà không có bất kỳ tham số, nó sẽ rethrow lỗi gây ra mã để nhập khối CATCH. Bạn có thể sử dụng kỹ thuật này để thực hiện ghi nhật ký lỗi trong cơ sở dữ liệu bằng cách bắt lỗi và ghi nhật ký chi tiết của chúng, sau đó đưa lỗi ban đầu vào ứng dụng máy khách, để nó có thể được xử lý ở đó.

Đây là một ví dụ về cách để rethrow một lỗi.

BEGIN TRY
    -- code to be executed
END TRY
BEGIN CATCH
    PRINT ERROR_MESSAGE();
    THROW
END CATCH

Trong một số phiên bản trước của SQL Server, không có phương pháp để ném một lỗi hệ thống. Trong khi THROW không thể xác định một lỗi hệ thống để nâng cao, khi THROW được sử dụng mà không có tham số trong một khối CATCH, nó sẽ reraise cả lỗi hệ thống và người dùng.

Chức năng xử lý lỗi là gì

Khối CATCH làm cho các thông tin liên quan đến lỗi có sẵn trong suốt thời gian của khối CATCH. Điều này bao gồm các kính con, chẳng hạn như thủ tục lưu trữ, chạy từ trong khối CATCH.

Hàm xử lý lỗi

Bạn nên nhớ rằng, khi lập trình với @@ERROR, giá trị được giữ bởi biến hệ thống @@ERROR đã được đặt lại ngay sau khi câu lệnh tiếp theo được thực thi.

Một ưu điểm chính của xử lý ngoại lệ có cấu trúc trong T-SQL là một loạt các chức năng xử lý lỗi đã được cung cấp và giữ các giá trị của chúng trong suốt khối CATCH. Các hàm riêng biệt cung cấp từng thuộc tính của lỗi đã được nêu ra.

Điều này có nghĩa là bạn có thể viết quy trình được lưu trữ xử lý lỗi chung mà vẫn có thể truy cập thông tin liên quan đến lỗi.

  • Khối CATCH làm cho các thông tin liên quan đến lỗi có sẵn trong suốt thời gian của khối CATCH.
  • @@Error đặt lại khi chạy câu lệnh tiếp theo.

Quản lý lỗi trong mã

Tích hợp SQL CLR cho phép thực thi mã được quản lý trong SQL Server. Các ngôn ngữ .NET mức cao, chẳng hạn như C# và VB, có sẵn xử lý ngoại lệ chi tiết. Lỗi có thể được bắt bằng cách sử dụng các khối try/catch/finally .NET tiêu chuẩn.

Lỗi trong mã được quản lý

Nói chung, bạn có thể muốn bắt lỗi trong mã được quản lý càng nhiều càng tốt. Nó là quan trọng để nhận ra, mặc dù, rằng bất kỳ lỗi không được xử lý trong các mã được quản lý được thông qua trở lại để gọi mã T-SQL. Bất cứ khi nào bất kỳ lỗi nào xảy ra trong mã được quản lý được trả về SQL Server, nó sẽ xuất hiện là lỗi 6522. Có thể lồng các lỗi và lỗi cụ thể đó sẽ ngắt kết nối nguyên nhân thực sự của lỗi.

Một nguyên nhân hiếm nhưng có thể gây ra lỗi trong mã được quản lý sẽ là mã có thể thực hiện một câu lệnh RAISERROR T-SQL thông qua một đối tượng SqlCommand.