Những lỗi nào được kích hoạt bởi công cụ PHP?

PHP đã hỗ trợ xử lý ngoại lệ từ lâu; . Hỗ trợ ban đầu cho việc xử lý ngoại lệ đã được đưa vào ngôn ngữ từ phiên bản 5, với hai lớp ngoại lệ đơn giản được tích hợp sẵn – Exception và ErrorException, với sự hỗ trợ cho các lớp bổ sung thông qua SPL. Ý tưởng của bài đăng trên blog này là giới thiệu các khả năng xử lý ngoại lệ PHP hiện đại cho người đọc.  

giao diện mới

Mặc dù PHP 7 cung cấp cả hai lớp Lỗi và Ngoại lệ, trước tiên hãy kiểm tra giao diện Throwable. Cả hai lớp Lỗi và Ngoại lệ đều triển khai giao diện Có thể ném - đó là cơ sở cho bất kỳ đối tượng nào có thể được ném thông qua câu lệnh ném. Nó chỉ có một ngoại lệ cần lưu ý, nó không thể được triển khai trực tiếp trong các lớp vùng đất của người dùng mà chỉ thông qua việc mở rộng lớp Ngoại lệ. Ngoài ra, nó cung cấp một điểm duy nhất để bắt cả hai loại lỗi trong một câu lệnh



try {
// your code
} catch (Throwable $e) {
   echo 'Very nice way to catch Exception and Error exceptions';
}

Danh sách các lớp ngoại lệ tích hợp có sẵn kể từ PHP 7. 4

  • Ngoại lệ
  • ErrorException
  • Lỗi
  • Đối sốCountError
  • Số họcLỗi
  • Khẳng địnhLỗi
  • Phân chiaByZeroError
  • Lỗi biên dịch
  • Phân tích lỗi
  • LoạiLỗi

Có thể tìm thấy nhiều lớp ngoại lệ hơn trong Thư viện chuẩn của PHP. Và điều đáng chú ý nhất đến từ phần mở rộng JSON là lớp JsonException

Lỗi, cái gì?

Trong các phiên bản trước của PHP, các lỗi được xử lý hoàn toàn khác so với các ngoại lệ. Lỗi là thứ được tạo ra trong động cơ và miễn là nó không nghiêm trọng, nó có thể được xử lý bởi một chức năng do người dùng xác định

Vấn đề là có một số lỗi nghiêm trọng và không thể xử lý được bằng trình xử lý lỗi do người dùng xác định. Điều này có nghĩa là bạn không thể xử lý các lỗi nghiêm trọng trong PHP một cách duyên dáng. Có một số tác dụng phụ có vấn đề, chẳng hạn như mất ngữ cảnh thời gian chạy, hàm hủy sẽ không được gọi và xử lý chúng rất rắc rối. Trong PHP 7, các lỗi nghiêm trọng giờ đây là ngoại lệ và chúng ta có thể xử lý chúng rất dễ dàng. Lỗi nghiêm trọng dẫn đến một ngoại lệ lỗi bị ném. Bạn cần xử lý các lỗi không nghiêm trọng bằng chức năng xử lý lỗi

Đây là một ví dụ bắt lỗi nghiêm trọng trong PHP 7. 1. Lưu ý cách lỗi không nghiêm trọng không bị bắt

 

try {
   // this will generate notice that would not be caught
   echo $someNotSetVariable;
   // fatal error that now actually is caught
   someNoneExistentFunction();
} catch (Error $e) {
      echo "Error caught: " . $e->getMessage();
}

Tập lệnh này sẽ xuất ra thông báo lỗi khi cố gắng truy cập một biến không hợp lệ. Cố gắng gọi một hàm không tồn tại sẽ dẫn đến lỗi nghiêm trọng trong các phiên bản PHP trước, nhưng trong PHP 7. 1 bạn có thể bắt nó. Đây là đầu ra cho kịch bản

Notice: Undefined variable: someNotSetVariable on line 3
Error caught: Call to undefined function someNoneExistentFunction()

hằng số lỗi

PHP có rất nhiều hằng số được sử dụng liên quan đến lỗi. Các hằng này được sử dụng khi cấu hình PHP để ẩn hoặc hiển thị lỗi của một số lớp nhất định

Dưới đây là một số mã lỗi thường thấy nhất

  • E_DEPRECATED – trình thông dịch sẽ tạo loại cảnh báo này nếu bạn sử dụng tính năng ngôn ngữ không dùng nữa. Tập lệnh chắc chắn sẽ tiếp tục chạy mà không có lỗi
  • E_STRICT – tương tự như E_DEPRECATED, điều này cho thấy rằng bạn đang sử dụng một tính năng ngôn ngữ hiện không chuẩn và có thể không hoạt động trong tương lai. Tập lệnh sẽ tiếp tục chạy mà không có bất kỳ lỗi nào được đưa ra
  • E_PARSE – không thể phân tích cú pháp của bạn nên tập lệnh của bạn sẽ không bắt đầu. Thực thi tập lệnh thậm chí sẽ không bắt đầu
  • E_NOTICE – công cụ sẽ chỉ in ra một thông báo thông tin. Việc thực thi tập lệnh sẽ không bị hỏng và sẽ không có lỗi nào xảy ra
  • E_ERROR – tập lệnh không thể tiếp tục chạy và nó đang bị chấm dứt. Sẽ ném lỗi và cách chúng sẽ được xử lý tùy thuộc vào trình xử lý lỗi
  • E_RECOVERABLE_ERROR – nó chỉ ra rằng đã xảy ra một lỗi nguy hiểm có thể xảy ra, nhưng không khiến Động cơ ở trạng thái không ổn định. Việc thực thi tiếp theo phụ thuộc vào trình xử lý lỗi và lỗi chắc chắn sẽ được đưa ra

Để biết danh sách đầy đủ các hằng số, vui lòng tham khảo hướng dẫn sử dụng PHP

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

Hàm set_error_handler() được sử dụng để cho PHP biết cách xử lý các lỗi công cụ tiêu chuẩn không phải là phiên bản của lớp ngoại lệ Lỗi. Bạn không thể sử dụng chức năng xử lý lỗi cho các lỗi nghiêm trọng. Các ngoại lệ lỗi phải được xử lý bằng câu lệnh try/catch. set_error_handler() chấp nhận một tham số có thể gọi được. Callables trong PHP có thể được chỉ định theo hai cách. bằng một chuỗi biểu thị tên của một hàm hoặc bằng cách truyền một mảng chứa một đối tượng và tên của một phương thức (theo thứ tự đó). Bạn có thể chỉ định các phương thức được bảo vệ và riêng tư là có thể gọi được trong một đối tượng. Bạn cũng có thể chuyển null để yêu cầu PHP hoàn nguyên về việc sử dụng cơ chế xử lý lỗi tiêu chuẩn. Nếu trình xử lý lỗi của bạn không kết thúc chương trình và quay lại, thì tập lệnh của bạn sẽ tiếp tục thực thi ở dòng sau dòng xảy ra lỗi

PHP chuyển tham số cho hàm xử lý lỗi của bạn. Bạn có thể tùy chọn khai báo những thứ này trong chữ ký hàm nếu bạn muốn sử dụng chúng trong hàm của mình

Đây là một ví dụ về tùy chỉnh



function myCustomErrorHandler(int $errNo, string $errMsg, string $file, int $line) {
echo "Wow my custom error handler got #[$errNo] occurred in [$file] at line [$line]: [$errMsg]";
}

set_error_handler('myCustomErrorHandler');

try {
   what;
} catch (Throwable $e) {
   echo 'And my error is: ' . $e->getMessage();
}

Nếu bạn chạy mã này trong bảng điều khiển PHP php -a, bạn sẽ nhận được kết quả tương tự

Error #[2] occurred in [php shell code] at line [3]: [Use of undefined constant what - assumed 'what' (this will throw an Error in a future version of PHP)]

Các thư viện PHP nổi bật nhất sử dụng rộng rãi set_error_handler() của PHP và có thể biểu diễn tốt các trường hợp ngoại lệ và lỗi là các thành phần Gỡ lỗi và ErrorHandler của Whoops hoặc Symony. đề nghị của tôi là sử dụng một trong những. Nếu không, bạn luôn có thể lấy cảm hứng từ mã của họ. Mặc dù thành phần Gỡ lỗi được sử dụng rộng rãi trong hệ sinh thái Symfony, nhưng Whoops vẫn là thư viện được lựa chọn cho khung công tác Laravel.  

Để biết cách sử dụng chi tiết và nâng cao, vui lòng tham khảo hướng dẫn PHP về trình xử lý lỗi

Hiển thị hoặc chặn thông báo lỗi không nghiêm trọng

Khi ứng dụng của bạn được sản xuất, bạn muốn ẩn tất cả các thông báo lỗi hệ thống trong khi sản xuất và mã của bạn phải chạy mà không tạo cảnh báo hoặc thông báo. Nếu bạn sắp hiển thị thông báo lỗi, hãy đảm bảo rằng đó là thông báo bạn đã tạo và thông báo đó không bao gồm thông tin có thể giúp kẻ tấn công đột nhập vào hệ thống của bạn

Trong môi trường phát triển của mình, bạn muốn tất cả các lỗi được hiển thị để bạn có thể khắc phục tất cả các vấn đề liên quan đến chúng, nhưng trong khi sản xuất, bạn muốn chặn mọi thông báo hệ thống được gửi tới người dùng

Để thực hiện điều này, bạn cần định cấu hình PHP bằng cách sử dụng các cài đặt sau trong tệp php của mình. tập tin ini

  • display_errors – có thể được đặt thành false để chặn thông báo
  • log_errors – có thể được sử dụng để lưu trữ thông báo lỗi trong tệp nhật ký
  • error_reporting – có thể được đặt để định cấu hình lỗi nào kích hoạt báo cáo

Cách tốt nhất là xử lý các lỗi trong ứng dụng của bạn một cách duyên dáng. Trong quá trình sản xuất, bạn nên ghi lại các lỗi chưa được xử lý thay vì cho phép chúng hiển thị cho người dùng. Hàm error_log() có thể được sử dụng để gửi một thông báo đến một trong các quy trình xử lý lỗi đã xác định. Bạn cũng có thể sử dụng hàm error_log() để gửi email, nhưng cá nhân tôi thì thà sử dụng một giải pháp tốt để ghi lỗi và nhận thông báo khi xảy ra lỗi như Sentry hoặc Rollbar

Có một thứ gọi là Toán tử kiểm soát lỗi – ký hiệu (@) – về bản chất có thể bỏ qua và loại bỏ lỗi. Cách sử dụng rất dễ dàng – chỉ cần thêm vào trước bất kỳ biểu thức PHP nào có ký hiệu và lỗi được tạo sẽ bị bỏ qua. Mặc dù sử dụng toán tử này có vẻ thú vị nhưng tôi khuyên bạn không nên làm điều đó. Tôi thích gọi nó là di tích sống từ quá khứ

Thông tin thêm về tất cả chức năng liên quan đến lỗi PHP có thể được tìm thấy trong sách hướng dẫn

ngoại lệ

Ngoại lệ là một phần cốt lõi của lập trình hướng đối tượng và lần đầu tiên được giới thiệu trong PHP 5. 0. Ngoại lệ là trạng thái chương trình yêu cầu xử lý đặc biệt vì nó không chạy theo cách mong đợi. Bạn có thể sử dụng một ngoại lệ để thay đổi luồng chương trình của mình, chẳng hạn như ngừng thực hiện điều gì đó nếu một số điều kiện tiên quyết không được đáp ứng

Một ngoại lệ sẽ xuất hiện trong ngăn xếp cuộc gọi nếu bạn không nắm bắt được nó. Hãy kiểm tra một ví dụ đơn giản

try {
   print "this is our try block n";
   throw new Exception();
} catch (Exception $e) {
   print "something went wrong, caught yah!";
} finally {
   print "this part is always executed n";
}

PHP bao gồm một số loại ngoại lệ tiêu chuẩn và thư viện PHP tiêu chuẩn (SPL) bao gồm một số loại khác. Mặc dù bạn không phải sử dụng các ngoại lệ này, nhưng làm như vậy có nghĩa là bạn có thể sử dụng báo cáo và phát hiện lỗi chi tiết hơn. Các lớp Ngoại lệ và Lỗi đều triển khai giao diện Có thể ném và, giống như bất kỳ lớp nào khác, có thể được mở rộng. Điều này cho phép bạn tạo hệ thống phân cấp lỗi linh hoạt và điều chỉnh cách xử lý ngoại lệ của mình. Chỉ một lớp triển khai lớp Có thể ném mới có thể được sử dụng với từ khóa ném. Nói cách khác, bạn không thể khai báo lớp cơ sở của riêng mình và sau đó ném nó như một ngoại lệ

Mã mạnh có thể gặp lỗi và đối phó với nó. Xử lý các ngoại lệ theo cách hợp lý sẽ cải thiện tính bảo mật của ứng dụng của bạn và giúp ghi nhật ký và gỡ lỗi dễ dàng hơn. Quản lý lỗi trong ứng dụng của bạn cũng sẽ cho phép bạn cung cấp cho người dùng trải nghiệm tốt hơn. Trong phần này, chúng tôi đề cập đến cách bẫy và xử lý các lỗi xảy ra trong mã của bạn

Bắt ngoại lệ

Hãy xem ví dụ đơn giản này



class MyCustomException extends Exception { }

function throwMyCustomException() {
      throw new MyCustomException('There is something wrong.');
}

try {
   throwMyCustomException();
} catch (MyCustomException $e) {
   echo "Your custom exception caught ";
   echo $e->getMessage();
} catch (Exception $e) {
   echo "PHP base exception caught";
}

Như bạn có thể thấy, có hai mệnh đề bắt. Các ngoại lệ sẽ được so khớp với các mệnh đề từ trên xuống dưới cho đến khi loại ngoại lệ khớp với mệnh đề bắt. Hàm throwMyCustomException() rất đơn giản này sẽ ném MyCustomException và chúng tôi hy vọng nó sẽ được bắt trong khối đầu tiên. Bất kỳ trường hợp ngoại lệ nào khác sẽ xảy ra sẽ bị bắt bởi khối thứ hai. Ở đây chúng ta đang gọi phương thức getMessage() từ lớp Exception cơ sở. Bạn có thể tìm thêm thông tin về phương thức bổ sung trong tài liệu PHP ngoại lệ

Bạn cũng có thể chỉ định nhiều ngoại lệ bằng cách tách chúng bằng dấu gạch ngang (. ) nhân vật

Hãy xem một ví dụ khác



class MyCustomException extends Exception { }
class MyAnotherCustomException extends Exception { }

try {
   throw new MyAnotherCustomException;
} catch (MyCustomException | MyAnotherCustomException $e) {
   echo "Caught : " . get_class($e);
}

Khối bắt rất đơn giản này sẽ bắt các ngoại lệ kiểu MyCustomException và MyAnotherCustomException

Kịch bản đánh bắt nâng cao hơn một chút

________số 8_______

Đây có phải là câu trả lời cuối cùng của bạn?

Trong PHP5. 5 trở lên, khối cuối cùng cũng có thể được chỉ định sau hoặc thay vì khối bắt. Mã trong khối cuối cùng sẽ luôn được thực thi sau khối thử và bắt, bất kể ngoại lệ đã được ném hay chưa và trước khi tiếp tục thực thi bình thường. Một cách sử dụng chung cho khối cuối cùng là đóng kết nối cơ sở dữ liệu, nhưng cuối cùng có thể được sử dụng bất cứ nơi nào bạn muốn mã luôn được thực thi



class MyCustomException extends Exception { }

function throwMyCustomException() {
   throw new MyCustomException('There is something wrong.');
}

try {
   throwMyCustomException();
} catch (MyCustomException $e) {
   echo "Your custom exception caught ";
   echo $e->getMessage();
} catch (Exception $e) {
   echo "PHP base exception caught";
} finally {
  echo "I'm always here";
}

Đây là một ví dụ điển hình phù hợp với cách hoạt động của các câu lệnh catch/cuối cùng của PHP

 

try {
   // this will generate notice that would not be caught
   echo $someNotSetVariable;
   // fatal error that now actually is caught
   someNoneExistentFunction();
} catch (Error $e) {
      echo "Error caught: " . $e->getMessage();
}
0

Hàm xử lý ngoại lệ

Bất kỳ ngoại lệ nào không bị bắt đều dẫn đến lỗi nghiêm trọng. Nếu bạn muốn phản hồi một cách duyên dáng với các ngoại lệ không bị bắt trong các khối bắt, bạn sẽ cần đặt một hàm làm trình xử lý ngoại lệ mặc định

Để làm như vậy, bạn sử dụng hàm set_Exception_handler(), hàm này chấp nhận tham số có thể gọi được. Tập lệnh của bạn sẽ chấm dứt sau khi lệnh gọi được thực thi

Hàm restore_Exception_handler() sẽ hoàn nguyên trình xử lý ngoại lệ về giá trị trước đó

 

try {
   // this will generate notice that would not be caught
   echo $someNotSetVariable;
   // fatal error that now actually is caught
   someNoneExistentFunction();
} catch (Error $e) {
      echo "Error caught: " . $e->getMessage();
}
1

Ở đây, hàm exception_handler đơn giản sẽ được thực thi sau khi chặn cuối cùng khi không có loại ngoại lệ nào phù hợp. Câu lệnh in cuối cùng sẽ không bao giờ được thực thi

Để biết thêm thông tin, hãy tham khảo tài liệu PHP

“T_PAAMAYIM_NEKUDOTAYIM” cũ tốt

Đây có lẽ là thông báo lỗi PHP nổi tiếng nhất từ ​​trước đến nay. Đã có nhiều tranh cãi về nó trong những năm gần đây. Bạn có thể đọc thêm trong một bài đăng blog xuất sắc từ Phil Sturgeon.   

Hôm nay tôi có thể tự hào nói rằng nếu bạn chạy mã này với PHP 7 thì sẽ không xảy ra T_PAAMAYIM_NEKUDOTAYIM

 

try {
   // this will generate notice that would not be caught
   echo $someNotSetVariable;
   // fatal error that now actually is caught
   someNoneExistentFunction();
} catch (Error $e) {
      echo "Error caught: " . $e->getMessage();
}
2

Phần kết luận

Kể từ lần đầu tiên giới thiệu xử lý ngoại lệ cho PHP, nhiều năm đã trôi qua cho đến khi chúng tôi kết thúc với việc xử lý ngoại lệ hoàn thiện và vững chắc hơn nhiều mà Java đã có, khá thẳng thắn từ lâu. Việc xử lý lỗi trong PHP 7 đã nhận được nhiều sự chú ý khiến nó trở nên tốt hơn, mở ra không gian cho những cải tiến trong tương lai nếu chúng ta thực sự cần từ quan điểm ngày nay.

Loại lỗi nào có thể xảy ra trong PHP?

Bốn loại lỗi PHP là. .
Lỗi cảnh báo
thông báo lỗi
Lỗi phân tích cú pháp
Lỗi nghiêm trọng

Lỗi PHP ở đâu?

Vị trí của tệp nhật ký lỗi có thể được đặt thủ công trong php. tập tin ini. Trên máy chủ Windows, trong IIS, nó có thể giống như "'error_log = C. \log_files\php_errors. log '" trong Linux, nó có thể là giá trị của "'/var/log/php_errors.

Mức độ lỗi nào để báo lỗi trong công cụ khởi động PHP?

18. Mức độ lỗi nào để báo lỗi trong công cụ khởi động PHP? . E_CORE_ERROR là mức lỗi để báo lỗi trong quá trình khởi động PHP engine

Có bao nhiêu cấp độ lỗi trong PHP?