Đưa ra các ngoại lệ trong một khối Thử Catch trong PHP


76

Tôi có một hàm PHP trong tệp .module Drupal 6. 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 để triển khai các câu lệnh IF ở đầu khối Thử của mình. Khối này đã đưa ra các ngoại lệ mới nếu xác thực không thành công. Ngoại lệ được ném sẽ bị bắt trong khối Catch. Sau đây là mã PHP của tôi:

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 là "ném $ e;"
Christoff Erasmus

Cùng một mã dường như sản phẩm: Parse error: syntax error, unexpected 'throw' (T_THROW). Tôi đoán không còn được hỗ trợ.
user2924019

Câu trả lời:


105
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 Bắt sẽ giải quyết được vấn đề của tôi. Cảm ơn!
kaspnord

67

Để rethrow làm

 throw $e;

không phải tin nhắn.


Cảm ơn, giải pháp này là thích hợp nhất cho nhu cầu của tôi.
kaspnord

Đó là những gì tôi nghĩ, rất vui được giúp đỡ.
Chen Kinnrot

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

4
giữ lại, để ghi đè ném một e mới
Chen Kinnrot

16

Chỉ cần xóa throwkhỏi khối bắt - thay đổi nó thành một echohoặc cách khác để xử lý lỗi.

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

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

Một sự tương tự trong thế giới thực về những gì bạn đang làm là bắt một quả bóng, sau đó cố gắng ném logo của nhà sản xuất vào một nơi khác. Bạn chỉ có thể ném toàn bộ một đối tượng, không phải một thuộc tính của đối tượng.


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

Tương tự tốt (y).
Tony Vlcek

7
throw $e->getMessage();

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

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


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

Tóm lại: Có. Về lâu dài: Xử lý sự xuất hiện của các đối số không hợp lệ giống 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ị một trang (error-) hữu ích khác. function validateField($validate) {return empty($validate);}và một nơi nào đó chẳng hạnif validateField($x){ echo "Field is empty";}else{doSomethingUseful();}
KingCrunch

4
@lazycommit "dữ liệu không hợp lệ" nói chung là một chút. Nếu ý của bạn là "các giá trị không hợp lệ được cung cấp từ người dùng", thì chúng không phải là không hợp lệ theo quan điểm của ứng dụng, bởi vì ứng dụng phải mong đợi điều này và do đó phải xử lý chúng thích hợp (-> xác nhận). Nếu bạn chuyển dữ liệu không hợp lệ sau đó trong quá trình xử lý (từ chương trình phụ trợ hoặc do bạn không xác thực đúng cách), thì có: Ngoại lệ. Nói tóm lại: Không sử dụng Exceptions để kiểm soát dòng chảy (ở đây: xác nhận) :)
KingCrunch

Bạn chỉ có thể throwđối tượng, vì vậy throw $e;hoặc throw new \Exception( $e->getMessage() );.
Samuel Elh

0

Ném cần một đối tượng khởi tạo bởi \Exception. Chỉ cần $ebắt được có thể chơi lừa.

throw $e
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.