Làm cách nào để bắt ngoại lệ PDO trong PHP?

Xử lý ngoại lệ được sử dụng để thay đổi quy trình thực thi mã bình thường nếu xảy ra tình trạng lỗi (ngoại lệ) được chỉ định. Điều kiện này được gọi là ngoại lệ

Đây là điều thường xảy ra khi một ngoại lệ được kích hoạt

  • Trạng thái mã hiện tại được lưu
  • Việc thực thi mã sẽ chuyển sang chức năng xử lý ngoại lệ (tùy chỉnh) được xác định trước
  • Tùy thuộc vào tình huống, trình xử lý sau đó có thể tiếp tục thực thi từ trạng thái mã đã lưu, chấm dứt thực thi tập lệnh hoặc tiếp tục tập lệnh từ một vị trí khác trong mã

Chúng tôi sẽ hiển thị các phương pháp xử lý lỗi khác nhau

  • Sử dụng cơ bản các ngoại lệ
  • Tạo trình xử lý ngoại lệ tùy chỉnh
  • Nhiều ngoại lệ
  • Ném lại một ngoại lệ
  • Đặt trình xử lý ngoại lệ cấp cao nhất

Ghi chú. Các ngoại lệ chỉ nên được sử dụng với các điều kiện lỗi và không được sử dụng để nhảy đến một vị trí khác trong mã tại một điểm đã chỉ định


Sử dụng cơ bản các ngoại lệ

Khi một ngoại lệ được ném ra, mã theo sau nó sẽ không được thực thi và PHP sẽ cố gắng tìm khối "bắt" phù hợp

Nếu một ngoại lệ không bị bắt, một lỗi nghiêm trọng sẽ được đưa ra với thông báo "Ngoại lệ chưa được bắt"

Hãy thử ném một ngoại lệ mà không bắt nó

//tạo hàm có ngoại lệ
hàm checkNum($number) {
if($number>1) {
ném Ngoại lệ mới ("Giá trị phải từ 1 trở xuống");
}
trả về đúng;
}

// kích hoạt ngoại lệ
checkNum(2);
?>

Đoạn mã trên sẽ gặp lỗi như thế này

Lỗi nghiêm trọng. Ngoại lệ chưa được phát hiện 'Ngoại lệ'
với thông báo 'Giá trị phải từ 1 trở xuống' trong C. \webfolder\test. php. 6
dấu vết ngăn xếp. #0 độ C. \webfolder\test. php(12)
checkNum(28) #1 {main} được ném vào C. \webfolder\test. php trên dòng 6

Hãy thử, ném và bắt

Để tránh lỗi từ ví dụ trên, chúng ta cần tạo mã thích hợp để xử lý ngoại lệ

Mã ngoại lệ thích hợp nên bao gồm

  1. 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. Tuy nhiên, nếu ngoại lệ kích hoạt, một ngoại lệ sẽ bị "ném"
  2. throw - Đây là cách bạn kích hoạt một ngoại lệ. Mỗi lần "ném" phải có ít nhất một lần "bắt"
  3. catch - Một khối "bắt" truy xuất một ngoại lệ và tạo một đối tượng chứa thông tin ngoại lệ

Hãy thử kích hoạt một ngoại lệ với mã hợp lệ

//tạo hàm có ngoại lệ
hàm checkNum($number) {
if($number>1) {
ném Ngoại lệ mới ("Giá trị phải từ 1 trở xuống");
}
trả về đúng;
}

// kích hoạt ngoại lệ trong khối "thử"
cố gắng {
checkNum(2);
// Nếu ném ngoại lệ, văn bản này sẽ không được hiển thị
echo 'Nếu bạn thấy điều này, số này là 1 hoặc thấp hơn';
}

// bắt ngoại lệ
bắt(Ngoại lệ $e) {
tiếng vang 'Tin nhắn. '. $e->getMessage();
}
?>

Đoạn mã trên sẽ gặp lỗi như thế này

Thông điệp. Giá trị phải từ 1 trở xuống

Ví dụ giải thích

Đoạn mã trên ném một ngoại lệ và bắt nó

  1. Hàm checkNum() được tạo. Nó kiểm tra nếu một số lớn hơn 1. Nếu có, một ngoại lệ được ném ra
  2. Hàm checkNum() được gọi trong khối "thử"
  3. Ngoại lệ trong hàm checkNum() được ném ra
  4. Khối "catch" truy xuất ngoại lệ và tạo đối tượng ($e) chứa thông tin ngoại lệ
  5. Thông báo lỗi từ ngoại lệ được lặp lại bằng cách gọi $e->getMessage() từ đối tượng ngoại lệ

Tuy nhiên, một cách để khắc phục quy tắc "mỗi lần ném phải có một lần bắt" là đặt trình xử lý ngoại lệ cấp cao nhất để xử lý các lỗi trượt qua



Tạo một lớp ngoại lệ tùy chỉnh

Để tạo trình xử lý ngoại lệ tùy chỉnh, bạn phải tạo một lớp đặc biệt với các hàm có thể được gọi khi có ngoại lệ xảy ra trong PHP. Lớp phải là phần mở rộng của lớp ngoại lệ

Lớp ngoại lệ tùy chỉnh kế thừa các thuộc tính từ lớp ngoại lệ của PHP và bạn có thể thêm các chức năng tùy chỉnh vào nó

Hãy tạo một lớp ngoại lệ

lớp customException mở rộng Ngoại lệ {
hàm công khai errorMessage() {
//thông báo lỗi
$errorMsg = 'Lỗi trên đường truyền'. $this->getLine(). ' Trong '. $this->getFile()
    . '. '. $this->getMessage(). ' không phải là một địa chỉ E-Mail hợp lệ';
trả lại $ errorMsg;
}
}

$email = "ai đó@ví dụ. com";

cố gắng {
//kiểm tra nếu
if(filter_var($email, FILTER_VALIDATE_EMAIL) === FALSE) {
//ném ngoại lệ nếu email không hợp lệ
ném customException mới($email);
}
}

bắt (customException $e) {
// hiển thị thông báo tùy chỉnh
  echo $e->errorMessage();
}
?>

Lớp mới là bản sao của lớp ngoại lệ cũ có thêm hàm errorMessage(). Vì nó là bản sao của lớp cũ và nó kế thừa các thuộc tính và phương thức từ lớp cũ, nên chúng ta có thể sử dụng các phương thức của lớp ngoại lệ như getLine() và getFile() và getMessage()

Ví dụ giải thích

Đoạn mã trên đưa ra một ngoại lệ và bắt nó bằng một lớp ngoại lệ tùy chỉnh

  1. Lớp customException() được tạo như một phần mở rộng của lớp ngoại lệ cũ. Bằng cách này, nó kế thừa tất cả các phương thức và thuộc tính từ lớp ngoại lệ cũ
  2. Hàm errorMessage() được tạo. Hàm này trả về thông báo lỗi nếu địa chỉ email không hợp lệ
  3. Biến $email được đặt thành một chuỗi không phải là địa chỉ email hợp lệ
  4. Khối "thử" được thực thi và một ngoại lệ được đưa ra do địa chỉ email không hợp lệ
  5. Khối "bắt" bắt ngoại lệ và hiển thị thông báo lỗi

Nhiều ngoại lệ

Tập lệnh có thể sử dụng nhiều ngoại lệ để kiểm tra nhiều điều kiện

Có thể sử dụng một số nếu. các khối khác, một công tắc hoặc lồng nhiều ngoại lệ. Các ngoại lệ này có thể sử dụng các lớp ngoại lệ khác nhau và trả về các thông báo lỗi khác nhau

lớp customException mở rộng Ngoại lệ {
hàm công khai errorMessage() {
//thông báo lỗi
$errorMsg = 'Lỗi trên đường truyền'. $this->getLine(). ' Trong '. $this->getFile()
    . '. '. $this->getMessage(). ' không phải là một địa chỉ E-Mail hợp lệ';
trả lại $ errorMsg;
}
}

$email = "ai đó@ví dụ. com";

cố gắng {
//kiểm tra nếu
if(filter_var($email, FILTER_VALIDATE_EMAIL) === FALSE) {
//ném ngoại lệ nếu email không hợp lệ
ném customException mới($email);
}
// kiểm tra "ví dụ" trong địa chỉ thư
if(strpos($email, "ví dụ"). == FALSE) {
ném ngoại lệ mới("$email là một ví dụ về e-mail");
}
}

bắt (customException $e) {
  echo $e->errorMessage();
}

bắt(Ngoại lệ $e) {
tiếng vang $e->getMessage();
}
?>

Ví dụ giải thích

Đoạn mã trên kiểm tra hai điều kiện và đưa ra một ngoại lệ nếu bất kỳ điều kiện nào không được đáp ứng

  1. Lớp customException() được tạo như một phần mở rộng của lớp ngoại lệ cũ. Bằng cách này, nó kế thừa tất cả các phương thức và thuộc tính từ lớp ngoại lệ cũ
  2. Hàm errorMessage() được tạo. Hàm này trả về thông báo lỗi nếu địa chỉ email không hợp lệ
  3. Biến $email được đặt thành một chuỗi là địa chỉ email hợp lệ, nhưng chứa chuỗi "ví dụ"
  4. Khối "thử" được thực thi và một ngoại lệ không được ném vào điều kiện đầu tiên
  5. Điều kiện thứ hai kích hoạt một ngoại lệ vì e-mail chứa chuỗi "ví dụ"
  6. Khối "bắt" bắt ngoại lệ và hiển thị thông báo lỗi chính xác

Nếu ngoại lệ được ném thuộc về lớp customException và không có bắt customException, chỉ bắt ngoại lệ cơ sở, thì ngoại lệ sẽ được xử lý ở đó


Ném lại ngoại lệ

Đôi khi, khi một ngoại lệ được đưa ra, bạn có thể muốn xử lý nó khác với cách thông thường. Có thể ném ngoại lệ lần thứ hai trong khối "bắt"

Tập lệnh nên ẩn lỗi hệ thống khỏi người dùng. Lỗi hệ thống có thể quan trọng đối với người viết mã, nhưng không được người dùng quan tâm. Để giúp người dùng dễ dàng hơn, bạn có thể ném lại ngoại lệ bằng thông báo thân thiện với người dùng

lớp customException mở rộng Ngoại lệ {
hàm công khai errorMessage() {
//thông báo lỗi
$errorMsg = $this->getMessage(). ' không phải là một địa chỉ E-Mail hợp lệ. ';
trả lại $ errorMsg;
}
}

$email = "ai đó@ví dụ. com";

cố gắng {
cố gắng {
// kiểm tra "ví dụ" trong địa chỉ thư
if(strpos($email, "ví dụ"). == FALSE) {
//ném ngoại lệ nếu email không hợp lệ
ném Ngoại lệ mới ($ email);
}
}
bắt(Ngoại lệ $e) {
// ném lại ngoại lệ
ném customException mới($email);
}
}

bắt (customException $e) {
// hiển thị thông báo tùy chỉnh
  echo $e->errorMessage();
}
?>

Ví dụ giải thích

Đoạn mã trên kiểm tra xem địa chỉ email có chứa chuỗi "ví dụ" trong đó không, nếu có, ngoại lệ sẽ được ném lại

  1. Lớp customException() được tạo như một phần mở rộng của lớp ngoại lệ cũ. Bằng cách này, nó kế thừa tất cả các phương thức và thuộc tính từ lớp ngoại lệ cũ
  2. Hàm errorMessage() được tạo. Hàm này trả về thông báo lỗi nếu địa chỉ email không hợp lệ
  3. Biến $email được đặt thành một chuỗi là địa chỉ email hợp lệ, nhưng chứa chuỗi "ví dụ"
  4. Khối "thử" chứa một khối "thử" khác để có thể ném lại ngoại lệ
  5. Ngoại lệ được kích hoạt do e-mail chứa chuỗi "ví dụ"
  6. Khối "bắt" bắt ngoại lệ và ném lại "customException"
  7. "CustomException" bị bắt và hiển thị thông báo lỗi

Nếu ngoại lệ không bị bắt trong khối "thử" hiện tại của nó, thì nó sẽ tìm kiếm khối bắt ở "cấp độ cao hơn"


Đặt Trình xử lý ngoại lệ cấp cao nhất

Hàm set_exception_handler() đặt hàm do người dùng xác định để xử lý tất cả các ngoại lệ chưa được phát hiện

hàm myException($Exception) {
tiếng vang "Ngoại lệ. ". $Exception->getMessage();
}

set_Exception_handler('myException');

ném ngoại lệ mới ('Đã xảy ra ngoại lệ chưa bắt buộc');
?>

Đầu ra của đoạn mã trên phải giống như thế này

Ngoại lệ. Ngoại lệ chưa được xử lý đã xảy ra

Trong đoạn mã trên không có khối "bắt". Thay vào đó, trình xử lý ngoại lệ cấp cao nhất được kích hoạt. Hàm này nên được sử dụng để bắt các ngoại lệ chưa được phát hiện

Làm cách nào để kiểm tra lỗi truy vấn PDO?

PDO sẽ chỉ đặt mã lỗi để bạn kiểm tra bằng cách sử dụng PDO. errorCode() và PDO. errorInfo() trên cả đối tượng câu lệnh và cơ sở dữ liệu ; . errorCode() hoặc PDOStatement. errorInfo() trên đối tượng đó.

Ngoại lệ PDO trong PHP là gì?

PDOException PHP là một ngoại lệ thời gian chạy xảy ra khi có lỗi xảy ra khi sử dụng lớp PDO (Đối tượng dữ liệu PHP) hoặc các phần mở rộng có liên quan của nó . Ví dụ: ngoại lệ này có thể xảy ra trong khi xử lý các kết nối hoặc truy vấn cơ sở dữ liệu.

Làm cách nào để bắt 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ệ

Làm cách nào để sử dụng PDO trong PHP?

Chi tiết về Phương thức Lớp PDO .
Tên người dùng - Một chuỗi chứa tên người dùng của người dùng. Đối với một số trình điều khiển PDO nhất định, tham số này là tùy chọn
Mật khẩu - Mật khẩu của người dùng được lưu trữ trong chuỗi này. .
Tùy chọn trình điều khiển - Đây là tham số tùy chọn—một khóa=>danh sách giá trị của các tùy chọn liên kết duy nhất cho trình điều khiển