2012-01-27 25 views
53

Tôi có một hàm PHP trong tệp Drodal 6 .module. Tôi đang cố gắng chạy xác thực biến ban đầu trước khi thực hiện các tác vụ chuyên sâu hơn (chẳng hạn như truy vấn cơ sở dữ liệu). Trong C#, tôi đã sử dụng để thực hiện các câu lệnh IF ở đầu khối Thử của tôi đã ném ra các ngoại lệ mới nếu xác thực không thành công. Các ngoại lệ ném sẽ bị bắt trong khối Catch. Sau đây là mã PHP của tôi:Ném ngoại lệ trong khối Thử nghiệm PHP

function _modulename_getData($field, $table) { 
    try { 
    if (empty($field)) { 
     throw new Exception("The field is undefined."); 
    } 
    // rest of code here... 
    } 
    catch (Exception $e) { 
    throw $e->getMessage(); 
    } 
} 

Tuy nhiên, khi tôi cố gắng chạy mã, nó cho tôi biết rằng các đối tượng chỉ có thể được ném trong khối Catch.

Cảm ơn trước!

+3

tl; dr "ném $ e-> getMessage();" nên "ném $ e;" –

Trả lời

78
function _modulename_getData($field, $table) { 
    try { 
    if (empty($field)) { 
     throw new Exception("The field is undefined."); 
    } 
    // rest of code here... 
    } 
    catch (Exception $e) { 
    /* 
     Here you can either echo the exception message like: 
     echo $e->getMessage(); 

     Or you can throw the Exception Object $e like: 
     throw $e; 
    */ 
    } 
} 
+1

Có, cả hai đề xuất của bạn trong khối Catch sẽ giải quyết được sự cố của tôi. Cảm ơn! – kaspnord

0
throw $e->getMessage(); 

Bạn cố gắng ném một string

Là một sidenote: Trường hợp ngoại lệ thường để xác định trạng thái đặc biệt của ứng dụng và không cho thông báo lỗi sau khi xác nhận. Nó không phải là ngoại lệ, khi người dùng cung cấp cho bạn dữ liệu không hợp lệ

+0

Điều gì sẽ là cách tốt hơn để xử lý xác thực? Các câu lệnh IF có phù hợp hơn trong việc xử lý dữ liệu người dùng không hợp lệ không? – kaspnord

+0

Tóm lại: Có. Trong thời gian dài: Xử lý sự xuất hiện của các đối số không hợp lệ như bất kỳ tình huống nào khác có thể xảy ra trong ứng dụng của bạn và hiển thị trang hữu ích (lỗi) khác. 'function validateField ($ validate) {return empty ($ validate);}' và một nơi nào đó ví dụ 'if validateField ($ x) {echo" Field rỗng ";} else {doSomethingUseful();}' – KingCrunch

+0

Tôi thấy, cảm ơn để giải thích. – kaspnord

12

Chỉ cần xóa throw khỏi khối catch - thay đổi thành echo hoặc xử lý lỗi.

Nó không cho bạn biết rằng đối tượng chỉ có thể được ném vào khối catch, nó cho bạn biết rằng chỉ đối tượng có thể được ném và vị trí của lỗi nằm trong khối catch - có sự khác biệt.

Trong khối bắt bạn đang cố gắng vứt cái gì đó bạn vừa mới bắt được - điều này trong bối cảnh này cũng không có ý nghĩa gì - và điều bạn đang cố gắng ném là một chuỗi.

Thực tế tương tự về những gì bạn đang làm là bắt bóng, sau đó cố gắng ném biểu tượng của nhà sản xuất ở một nơi khác. Bạn chỉ có thể ném một vật thể hoàn toàn, không phải là tài sản của vật thể.

+0

Cảm ơn bạn đã làm rõ. – kaspnord

48

Để rethrow làm

throw $e; 

không được thông báo.

+0

Cảm ơn, giải pháp này phù hợp nhất với nhu cầu của tôi. – kaspnord

+0

Đó là những gì tôi nghĩ, sẵn lòng giúp đỡ. –

+4

Điều đó có giữ lại thông tin ngăn xếp hay nó sẽ ghi đè lên nó? – DanMan

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