2011-11-24 9 views
8

Tôi đang viết một tập lệnh trong PHP5 yêu cầu mã của một số tệp nhất định. Khi một tập tin không có sẵn để đưa vào, đầu tiên là một cảnh báo và sau đó một lỗi nghiêm trọng được ném ra. Tôi muốn in một thông báo lỗi riêng, khi không thể đưa mã vào. Có thể thực hiện một lệnh cuối cùng, nếu requeire không hoạt động? sau đây không làm việc:Làm thế nào để bắt lỗi của require() hoặc include() trong PHP?

require('fileERROR.php5') or die("Unable to load configuration file."); 

Supressing tất cả các thông báo lỗi sử dụng error_reporting(0) chỉ cung cấp một màn hình trắng, không sử dụng error_reporting cho PHP-lỗi, mà tôi không muốn hiển thị.

Trả lời

3

Cách tiếp cận tốt hơn là sử dụng realpath trên đường dẫn trước tiên. realpath sẽ trả lại false nếu tệp không tồn tại.

$filename = realpath(getcwd() . "/fileERROR.php5"); 
$filename && return require($filename); 
trigger_error("Could not find file {$filename}", E_USER_ERROR); 

Bạn thậm chí có thể tạo ra yêu cầu chức năng của riêng bạn trong ứng dụng của bạn namespace rằng kết thúc tốt đẹp của PHP đòi hỏi chức năng

namespace app; 

function require_safe($filename) { 
    $path = realpath(getcwd() . $filename); 
    $path && return require($path); 
    trigger_error("Could not find file {$path}", E_USER_ERROR); 
} 

Bây giờ bạn có thể sử dụng nó bất cứ nơi nào trong các tập tin của bạn

namespace app; 

require_safe("fileERROR.php5"); 
+0

Tôi hoàn toàn không biết tại sao, nhưng mã của bạn không hoạt động chính xác (sản xuất sai dương), khi chạy trong PHP CLI/console. I E. Nó tạm dừng thực thi kịch bản, tuyên bố rằng tệp XYZ không tồn tại, trong khi nó thực sự tồn tại - nhận xét ra mã của bạn và đi trực tiếp đến 'include()' hoạt động tốt và tệp được bao gồm không có lỗi. – trejder

1

tôi sẽ đề nghị bạn đã xem nhiều nhất recent comment trong tài liệu về hàm set_error_handler().

Nó gợi ý sau đây như một phương pháp (và với một ví dụ) bắt lỗi chết người:

<?php 
function shutdown() 
{ 
    $a=error_get_last(); 
    if($a==null) 
     echo "No errors"; 
    else 
     print_r($a); 

} 
register_shutdown_function('shutdown'); 
ini_set('max_execution_time',1); 
sleep(3); 
?> 

tôi đã không cố gắng đề nghị, nhưng điều này propably thể được sử dụng trong các tình huống lỗi nghiêm trọng khác.

+0

Trong khi điều này có thể làm việc, nó tạo ra câu hỏi hay, nếu điều này sẽ làm việc trong điều kiện, OP đang yêu cầu? Tôi tin rằng hầu hết mọi người đổ bộ ở đây đang tìm kiếm giải pháp, nơi họ có thể nắm bắt 'require' trên tập tin không tồn tại ** và tiếp tục ** thực thi tập lệnh. Có thể chết một cách duyên dáng (tức là hiển thị một cái gì đó, tôi muốn nhưng cuối cùng với việc chấm dứt kịch bản ngay cả như vậy - và đó là những gì mã của bạn dường như đang làm) dường như không phù hợp với nhiều kịch bản. Tôi giả sử, kịch bản có thể hiển thị bất cứ điều gì nó muốn nếu nó sẽ chết.Tôi muốn ngăn chặn chết/chấm dứt trên tập tin không tồn tại được cung cấp cho 'require'. – trejder

0

Bạn cần sử dụng include(). Yêu cầu(), khi được sử dụng trên tệp không tồn tại, tạo ra lỗi nghiêm trọng và thoát khỏi tập lệnh, do đó, lệnh die() của bạn sẽ không xảy ra. Bao gồm() chỉ ném cảnh báo và sau đó tập lệnh tiếp tục.

+0

Câu trả lời của bạn là cụ thể cho một phiên bản PHP nhất định hoặc cụ thể cho một số cấu hình 'php.ini' nhất định. Về phía tôi (PHP 5.5.4) với cấu hình của tôi, việc thay đổi 'require' thành' include' hoàn toàn không có sự khác biệt. Cả hai đều đang ném những lỗi nghiêm trọng, mà tôi không thể bắt được. – trejder

11

Bạn có thể thực hiện việc này bằng cách sử dụng set_error_handler kết hợp với ErrorException.

Ví dụ từ trang ErrorException là:

<?php 
function exception_error_handler($errno, $errstr, $errfile, $errline) { 
    throw new ErrorException($errstr, $errno, 0, $errfile, $errline); 
} 
set_error_handler("exception_error_handler"); 

/* Trigger exception */ 
strpos(); 
?> 

Một khi bạn đã lỗi được xử lý như trường hợp ngoại lệ, bạn có thể làm điều gì đó như:

<?php 
try { 
    include 'fileERROR.php5'; 
} catch (ErrorException $ex) { 
    echo "Unable to load configuration file."; 
    // you can exit or die here if you prefer - also you can log your error, 
    // or any other steps you wish to take 
} 
?> 
+0

@SajnEvardsson php manual có tham số thứ ba ErrorException là $ errno, không phải là tham số thứ hai. – Basit

+2

Ví dụ trên được sao chép trực tiếp từ tài liệu ErrorException (liên kết ở trên) - trong ví dụ "chính thức", họ sử dụng $ errno là $ code, trong khi các ví dụ khác (bao gồm trong các nhận xét trên trang đó) đã đề xuất sử dụng nó như $ severity - note rằng nếu bạn thích bạn có thể sử dụng nó cho cả hai, hoặc không. –

6

tôi chỉ sử dụng 'file_exists()':

if (file_exists("must_have.php")) { 
    require "must_have.php"; 
} 
else { 
    echo "Please try back in five minutes...\n"; 
}