2011-02-05 37 views
6

Có cách "tĩnh" để ném ngoại lệ trong php không?Có cách nào tĩnh để ném ngoại lệ trong php

Tôi cần phải ném ngoại lệ khi truy vấn mysql không thành công.

Tôi cố gắng này:

[email protected]_query($query) or throw new Exception(' Query Failed '); 

nhưng nó không làm việc.

Và tôi đang sử dụng chức năng dựa trên throwException() function from this comment at PHP: Exceptions manual, nhưng tôi muốn biết liệu có cách nào tĩnh để thực hiện việc này mà không cần tạo lớp hay không.

+0

"tĩnh" nghĩa là gì? – BoltClock

+0

bởi tĩnh Tôi có nghĩa là không khởi tạo một lớp – sreejith

+0

Tôi hy vọng rằng câu lệnh 'Truy vấn thất bại' vô dụng này chỉ là một ví dụ và thực tế bạn sẽ đặt một lỗi thực sự cùng với truy vấn –

Trả lời

4

Bạn sẽ không thể trực tiếp thực hiện or throw new Exception();throw là một tuyên bố chứ không phải là một biểu thức. Vì or thực sự là một toán tử, nó hy vọng các toán hạng của nó là các biểu thức (những thứ đánh giá một số giá trị).

Bạn sẽ phải làm điều này thay vì:

$re = mysql_query($query); 

if (!$re) { 
    throw new Exception('Query Failed'); 
} 

Nếu bạn đang cố gắng sử dụng các chức năng throwException() bởi rằng PHP thủ bình luận đề xuất, như webbiedave chỉ ra những nhận xét được nói rằng bạn cần phải gọi mà chức năng thay vì throw tuyên bố trực tiếp, như thế này:

$re = mysql_query($query) or throwException('Query Failed'); 

không có quy tắc trong PHP nói rằng bạn cần phải ném ngoại lệ từ một phương pháp học. Miễn là có một số cách để bắt ngoại lệ đó bạn tốt. Nếu bạn có nghĩa là bạn muốn ném ngoại lệ mà không sử dụng lớp học Exception, tốt, bạn phải làm như vậy. Ngoại lệ là các đối tượng theo bản chất; bạn không thể ném một ngoại lệ không phải là một đối tượng (hoặc không kế thừa từ lớp Exception).

Nếu bạn không muốn ném ngoại lệ nhưng tăng loại lỗi bạn thường thấy từ PHP (thông báo, cảnh báo và lỗi nghiêm trọng), hãy sử dụng trigger_error().

$re = mysql_query($query); 

if (!$re) { 
    trigger_error('Query Failed', E_USER_ERROR); 
} 
+0

Đó là một ý tưởng tuyệt vời cảm ơn !!! – sreejith

+0

Mọi thứ trong ngôn ngữ lập trình bắt buộc là một câu lệnh;) 'throw' là một cấu trúc ngôn ngữ, do đó nó được xử lý bởi trình phân tích cú pháp và không thể đánh giá thời gian chạy cho một số giá trị, có – meze

6

Nhận xét bạn liên kết với các trạng thái ném ngoại lệ theo cách này sẽ không hoạt động. Nó khẳng định bạn phải đặt nó trong một hàm:

function throwException($message = null, $code = null) { 
    throw new Exception($message, $code); 
} 

$re = mysql_query($query) or throwException('Query Failed'); 
+0

yeah. Tôi đang tìm cách để thực hiện một việc như Exception :: setMessage ('Message'); Nhưng bây giờ tôi biết điều đó là không thể sau khi BoltClock trả lời – sreejith

+0

@rados: Và anh ấy nói bạn gọi hàm sau 'hoặc', nhưng trong câu hỏi của bạn, bạn đang gọi câu lệnh' throw' thực tế thay vì hàm. – BoltClock

+0

@BoltClock có, những gì tôi đang làm bây giờ là một cái gì đó như thế này: $ re = @ mysql_query ($ truy vấn) hoặc IException :: throwException ('Truy vấn thất bại'); IException là lớp tôi tự tạo, tôi đang tìm kiếm một lớp được xác định trước thay vì sử dụng lớp của riêng tôi. – sreejith

2

Bạn cũng có thể thử một cái gì đó giống như

mysql_query($query); 

if (mysql_error()) { 
    throw new Exception(...); 
} 

như mysql_error() lợi nhuận chuỗi rỗng nếu không có lỗi, mà đánh giá để false.

+0

cảm ơn câu trả lời, đó là một cách tốt. – sreejith

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