2013-01-24 4 views
5

Trong quá trình học PHP, tôi đã cố gắng đọc các phương pháp hay nhất để báo cáo và xử lý lỗi, nhưng các câu lệnh khác nhau tùy theo người và tôi đã cố gắng tìm ra cách xử lý lỗi rõ ràng trong ứng dụng của mình . Tôi sử dụng ngoại lệ trên những thứ có thể sai, nhưng đối với hầu hết các phần, tôi khó hiểu liệu một ngoại lệ có nên giết ứng dụng và hiển thị trang lỗi hay chỉ bị bắt và âm thầm xử lý.Khi nào thì kiểm tra lỗi quá nhiều?

Điều gì đó dường như làm tôi thất vọng, liệu có quá nhiều báo cáo không? Mỗi lần bạn gọi một hàm nào đó có thể sai lầm khủng khiếp nghĩa là nếu bạn xác nhận mọi lời gọi hàm đơn lẻ, bạn sẽ phải điền vào các trang với câu lệnh if và tìm ra hiệu ứng nào có thể có trong phần còn lại. Có một tài liệu ngắn gọn hoặc ý tưởng cho báo cáo lỗi có thể xóa điều này cho tôi? Có thực hành tốt nhất không? Các ví dụ tốt nhất về xử lý lỗi tốt là gì?

Hiện nay tôi làm như sau:

  • Thêm kết quả sự kiện quan trọng đối với một mảng để đăng nhập và gửi qua email cho tôi nếu một lỗi nghiêm trọng đã xảy ra
  • Display trừu tượng/lỗi chung cho các lỗi gây tử vong.
  • Sử dụng ngoại lệ đối với trường hợp có khả năng thất bại
  • Bật báo cáo lỗi trong một môi trường phát triển và tắt cho môi trường sống
  • Validate tất cả dữ liệu người dùng nhập vào
  • Vệ sinh hợp lệ người dùng nhập vào
  • hiển thị ngắn gọn, nhiều thông tin thông báo lỗi cho người dùng mà không cung cấp nền tảng để khai thác.
+0

Cảnh báo ngắn: Không tắt báo cáo lỗi trong môi trường sản xuất. Chỉ cần vô hiệu hóa 'display_errors'. Bạn muốn biết * escpecially * nếu có gì sai trong sản xuất, phải không? (Tuy nhiên, không hiển thị lỗi cho người dùng là quan trọng để không để lộ bất kỳ phần thông tin quan trọng nào). –

+0

Cảm ơn Daniel. Tôi không nghĩ vậy. – Sam

Trả lời

3

Trường hợp ngoại lệ là điều duy nhất bạn chưa hiểu IMHO: ngoại lệ có nghĩa là nằm ngoài tầm kiểm soát của bạn, có nghĩa là bị xử lý từ bên ngoài phạm vi được đưa vào. một giới hạn cụ thể: nó phải chứa các hành động liên quan. Ví dụ: lấy một cơ sở dữ liệu thử khối catch:

$array = array(); 
try { 
    // connect throws exception on fail 
    // query throws exception on fail 
    // fetch results into $array 
} catch (...) { 
    $array[0]['default'] = 'me'; 
    $array[0]['default2'] = ...; 
    ... 
} 

như bạn có thể thấy tôi đặt mọi chức năng liên quan đến cơ sở dữ liệu bên trong khối thử. Nếu kết nối thất bại truy vấn và tìm nạp không được thực hiện bởi vì chúng sẽ không có ý nghĩa nếu không có kết nối. Nếu truy vấn thất bại việc tìm nạp bị bỏ qua vì sẽ không có ý nghĩa trong việc tìm nạp không có kết quả. Và nếu có gì sai, tôi có một mảng $ trống để xử lý: vì vậy tôi có thể, ví dụ, điền dữ liệu đó với dữ liệu mặc định.

Sử dụng ngoại lệ thích:

$array = array(); 
try { 
    if (!file_exists('file.php')) throw new Exception('file does not exists'); 
    include('file.php'); 
} catch (Exception $e) { 
    trigger_error($e->getMessage()); 
} 

làm cho không có ý nghĩa. Nó chỉ là phiên bản dài hơn:

if (!file_exists('file.php')) trigger_error('file does not exists'); 
    include('file.php'); 
+0

Bạn có dừng việc thực hiện phần còn lại của tập lệnh nếu bạn không thể kết nối với cơ sở dữ liệu không? Bởi vì có hiệu ứng xếp tầng đó. Nếu bạn không thể kết nối với cơ sở dữ liệu, bạn không thể làm được gì nhiều. – Sam

+1

@Sam, phụ thuộc vào ứng dụng. Điều chắc chắn là tôi sẽ không giết việc thực hiện toàn bộ ứng dụng với một ngoại lệ. 'trigger_error' là có cho điều đó.Ngoại lệ thực sự không có nghĩa là được sử dụng để giết ứng dụng, có nghĩa là để đối phó với các lỗi có thể phục hồi. – Shoe

+0

Ồ. Tôi chưa bao giờ coi nó như thế. Tôi nghĩ rằng họ đã cho một lớn. – Sam