2012-09-11 32 views
11
try  
{ 
    $matrix = Query::take("SELECT moo"); //this makes 0 sense 

    while($row = mysqli_fetch_array($matrix, MYSQL_BOTH)) //and thus this line should be an error 
    { 

    } 

    return 'something'; 
} 
catch(Exception $e) 
{ 
    return 'nothing'; 
} 

Tuy nhiên thay vì chỉ đi để bắt một phần và trở nothing nó cho thấy một cảnh báo Warning: mysqli_fetch_array() expects parameter 1 to be mysqli_result, null given trong dòng bắt đầu với while. Tôi chưa bao giờ đưa ra sử dụng ngoại lệ trong php, nhưng sử dụng chúng rất nhiều trong C# và có vẻ như trong PHP chúng đang hoạt động khác nhau hoặc, như mọi khi, tôi thiếu một cái gì đó hiển nhiên.PHP try-catch không làm việc

+0

Đây là một số câu hỏi của bạn: http://stackoverflow.com/questions/1241728/can-i-try-catch-a-warning –

+0

Trùng lặp: http://stackoverflow.com/questions/1241728/can- i-try-catch-a-warning – wesside

+0

Đọc http://phpmaster.com/error-handling-in-php/ – vascowhite

Trả lời

18

Bạn không thể xử lý Cảnh báo/Lỗi với các khối try-catch, vì chúng không phải là ngoại lệ. Nếu bạn muốn xử lý cảnh báo/lỗi, bạn phải đăng ký trình xử lý lỗi của riêng bạn với set_error_handler.

Nhưng tốt hơn là khắc phục sự cố này, vì bạn có thể ngăn chặn sự cố này.

+0

xây dựng trên câu trả lời này, bạn có thể dễ dàng thiết lập set_error_handler để nắm bắt các lỗi PHP và phát hành một ngoại lệ, tại thời điểm đó try-catch của bạn sẽ làm việc. Tôi chắc chắn bạn có thể Google cho một cái gì đó phù hợp. –

+0

Đối với trường hợp ném ngoại lệ, set_error_handler nên được sử dụng kết hợp với ErrorException (lớp tích hợp dành riêng cho việc sử dụng này). –

+0

Tôi đã làm php toàn thời gian cho một vài năm nay, và tôi thậm chí không biết điều này. –

6

Trong PHP, cảnh báo không phải là ngoại lệ. Nói chung, cách thực hành tốt nhất là sử dụng mã hóa phòng thủ để đảm bảo kết quả là những gì bạn mong đợi.

3

Welp, thật không may, đây là vấn đề về PHP. Các câu lệnh try/catch sẽ bắt các ngoại lệ, nhưng những gì bạn nhận được là một lỗi PHP cũ của trường.

Bạn sẽ phải bắt một lỗi như thế này với: http://php.net/manual/en/function.set-error-handler.php

Hoặc đó hoặc kiểm tra xem nếu $ ma trận là một đối tượng mysqli_result trước khi thực hiện mysqli_fetch_array.

+0

Xử lý lỗi PHP trường học cũ làm việc cho tôi. Cảm ơn bạn đã chỉ cho tôi theo đúng hướng đó! – Clomp

1

PHP đang tạo cảnh báo chứ không phải ngoại lệ. Cảnh báo không thể bị bắt. Họ giống như cảnh báo trình biên dịch trong C#.

0

Ngoại lệ chỉ là lớp con của Throwable. Để bắt lỗi bạn có thể thử để làm một trong các cách sau:

try { 

    catch (\Exception $e) { 
     //do something when exception is thrown 
} 
catch (\Error $e) { 
    //do something when error is thrown 
} 

HOẶC bao gồm nhiều giải pháp

try { 

catch (\Exception $e) { 
    //do something when exception is thrown 
} 
catch (\Throwable $e) { 
    //do something when Throwable is thrown 
} 

BTW: Java có hành vi tương tự.

Các vấn đề liên quan