Xử lý lỗi PHP: die () Vs trigger_error () Vs ném Ngoại lệ


119

Liên quan đến xử lý lỗi trong PHP - Theo tôi biết có 3 kiểu:

  1. die()hoặc exit()phong cách:

    $con = mysql_connect("localhost","root","password");
    
    if (!$con) {
     die('Could not connect: ' . mysql_error());
    }
  2. throw Exception Phong cách:

     if (!function_exists('curl_init')) {
    
          throw new Exception('need the CURL PHP extension. 
                               Recomplie PHP with curl');
        }
  3. trigger_error() Phong cách:

    if(!is_array($config) && isset($config)) {
            trigger_error('Error: config is not an array or is not set', E_USER_ERROR);
        }

Bây giờ, trong hướng dẫn sử dụng PHP, cả ba phương pháp đều được sử dụng.

  • Điều tôi muốn biết là tôi nên chọn phong cách nào & tại sao?

  • 3 thứ này có thay thế cho nhau không và do đó có thể được sử dụng thay thế cho nhau?

Hơi OT: Có phải chỉ tôi hay mọi người nghĩ rằng các tùy chọn xử lý lỗi PHP quá nhiều đến mức nó gây nhầm lẫn cho các nhà phát triển php không?


4
Đây không phải là "phong cách". Chúng là các đặc điểm ngôn ngữ khác nhau. Với các mục đích khác nhau.
mario

11
@mario: mục đích thụt lề khác nhau là gì? Xin hãy khai sáng cho tôi :)
CuriousMind

Bạn đặt câu hỏi một cách tuyệt vời. cảm ơn vì đã hỏi
Kế toán م

Câu trả lời:


86

Cái đầu tiên không bao giờ được sử dụng trong mã sản xuất, vì nó vận chuyển thông tin không liên quan đến người dùng cuối (người dùng không thể làm bất cứ điều gì về "Không thể kết nối với cơ sở dữ liệu" ).

Bạn ném Ngoại lệ nếu bạn biết rằng tại một điểm mã quan trọng nhất định, ứng dụng của bạn có thể bị lỗi và bạn muốn mã của mình khôi phục qua nhiều cấp độ cuộc gọi.

trigger_error()cho phép bạn báo cáo lỗi chi tiết (bằng cách sử dụng các mức thông báo lỗi khác nhau) và bạn có thể ẩn những lỗi đó với người dùng cuối (đang sử dụng set_error_handler()) nhưng vẫn hiển thị chúng cho bạn trong quá trình thử nghiệm.

Đồng thời trigger_error()có thể tạo ra các thông báo không nghiêm trọng quan trọng trong quá trình phát triển có thể bị chặn trong mã sản xuất bằng cách sử dụng trình xử lý lỗi tùy chỉnh. Bạn cũng có thể tạo ra các lỗi nghiêm trọng ( E_USER_ERROR) nhưng chúng không thể khôi phục được. Nếu bạn kích hoạt một trong số đó, việc thực thi chương trình sẽ dừng lại tại điểm đó. Đây là lý do tại sao, đối với các lỗi nghiêm trọng, nên sử dụng Ngoại lệ. Bằng cách này, bạn sẽ có nhiều quyền kiểm soát hơn đối với luồng chương trình của mình:

// Example (pseudo-code for db queries):

$db->query('START TRANSACTION');

try {
    while ($row = gather_data()) {
       $db->query('INSERT INTO `table` (`foo`,`bar`) VALUES(?,?)', ...);
    }
    $db->query('COMMIT');
} catch(Exception $e) {
    $db->query('ROLLBACK');
}

Ở đây, nếu gather_data()chỉ cần sơ suất (sử dụng E_USER_ERRORhoặc die()) thì vẫn có cơ hội, các INSERTcâu lệnh trước đó sẽ được đưa vào cơ sở dữ liệu của bạn, ngay cả khi không muốn và bạn không kiểm soát được điều gì sẽ xảy ra tiếp theo.


2
vì vậy trong số trigger_error()& ném các ngoại lệ: tôi nên sử dụng cái nào & khi nào?
CuriousMind

@Gaurish Xem ví dụ được thêm vào đó.
Linus Kleen

2
Sau khi đọc ví dụ của bạn, tôi nghĩ bây giờ tôi hiểu rõ hơn mục đích đằng sau ngoại lệ ném. Cảm ơn :)
CuriousMind

1
@Pacerier Điều đó thực sự phụ thuộc vào cấu hình của máy chủ. Một hệ thống có thể được định cấu hình để tự động gửi theo mặc định, do đó là rõ ràng ROLLBACK. Ví dụ về mã giả này bao gồm cả hai trường hợp: máy chủ không được định cấu hình để tự động gửi ( COMMITcâu lệnh là bắt buộc) và những máy chủ có.
Linus Kleen

1
@LinusKleen, không phải tính năng autocommit bị tắt sau khi chúng tôi chạy dòng phải query('START TRANSACTION');không?
Pacerier

10

Tôi thường sử dụng cách đầu tiên để gỡ lỗi đơn giản trong mã phát triển. Nó không được khuyến khích cho sản xuất. Cách tốt nhất là đưa ra một ngoại lệ mà bạn có thể bắt gặp trong các phần khác của chương trình và thực hiện một số xử lý lỗi.

Ba phong cách này không thay thế cho nhau. Cách đầu tiên hoàn toàn không phải là lỗi mà chỉ là một cách để dừng tập lệnh và xuất một số thông tin gỡ lỗi để bạn phân tích cú pháp theo cách thủ công. Lỗi thứ hai không phải là lỗi, nhưng sẽ được chuyển thành lỗi nếu bạn không nắm bắt được. Lỗi cuối cùng gây ra lỗi thực sự trong công cụ PHP sẽ được xử lý theo cấu hình của môi trường PHP của bạn (trong một số trường hợp được hiển thị cho người dùng, trong các trường hợp khác chỉ đăng nhập vào một tệp hoặc hoàn toàn không được lưu).


1
Điều gì xảy ra khi ngoại lệ được ném nhưng không bị bắt? nó sẽ gây ra một lỗi nghiêm trọng, tôi đoán. Và trigger_error()điều tương tự xảy ra. vậy sự khác biệt là gì?
CuriousMind

4
Sự khác biệt là bạn có thể bắt ngoại lệ và xử lý nó theo bất kỳ cách nào bạn muốn.
Emil Vikström
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.