2013-06-12 24 views
8

Câu hỏi này là về cách cách tốt nhất để thực thi mã bên ngoài khối try nếu không có ngoại lệ nào được ném.Cách sạch nhất để thực thi mã bên ngoài khối thử chỉ khi không có ngoại lệ được ném

try { 
    //experiment 
    //can't put code after experiment because I don't want a possible exception from this code to be caught by the following catch. It needs to bubble. 
} catch(Exception $explosion) { 
    //contain the blast 
} finally { 
    //cleanup 
    //this is not the answer since it executes even if an exception occured 
    //finally will be available in php 5.5 
} else { 
    //code to be executed only if no exception was thrown 
    //but no try ... else block exists in php 
} 

Đây là phương pháp được đề xuất bởi @webbiedave để đáp lại câu hỏi php try .. else. Tôi thấy nó không đạt yêu cầu vì việc sử dụng biến số $caught bổ sung.

$caught = false; 

try { 
    // something 
} catch (Exception $e) { 
    $caught = true; 
} 

if (!$caught) { 

} 

Vì vậy, cách tốt nhất (hoặc tốt nhất) để thực hiện điều này mà không cần thêm biến là gì?

+1

Đặt trong khối thử. Nếu nó có thể ném một ngoại lệ khác mà bạn không muốn bị chặn bởi khối thử bên ngoài, thì hãy sử dụng một lệnh try-catch lồng nhau để nắm bắt ngoại lệ đó. Tuy nhiên, hãy lưu ý rằng bạn không sử dụng ngoại lệ làm điều khiển luồng. – ssube

+0

@peachykeen Điều đó sẽ không hoạt động vì ngoại lệ cần phải bong bóng. –

+2

Nghe có vẻ như bạn đang sử dụng các ngoại lệ để kiểm soát việc thực hiện một chút quá nhiều. Bạn có chắc chắn bạn cần cả hai khối ném và bong bóng sau này? Nó có thể rất tốt là các ngoại lệ * nên * được thay thế bằng một biến và kiểm soát dòng chảy thích hợp. – ssube

Trả lời

4

Một khả năng là đặt khối thử trong một phương thức và trả về false nếu có ngoại lệ.

function myFunction() { 
    try { 
     // Code that throws an exception 
    } catch(Exception $e) { 
     return false; 
    } 
    return true; 
} 
+0

Điều này có thể được thực hiện với thử/nắm bắt không? – Orangepill

+0

nếu ngoại lệ cần truyền bá thì chỉ cần ném lại nó trong phần catch – Orangepill

+0

Tôi thích điều này hơn vì biến '$ myFunctionResult' sẽ được gán giá trị trả về' myFunction() 'sẽ không hoàn toàn tùy ý. –

0

Để khối catch của bạn thoát khỏi chức năng hoặc (lại) ném/ném ngoại lệ. Bạn cũng có thể lọc ngoại lệ của mình. Vì vậy, nếu mã khác của bạn cũng ném một ngoại lệ, bạn có thể nắm bắt và (lại) ném nó. Hãy nhớ rằng:

  1. Thực hiện tiếp tục nếu không có ngoại lệ nào bị bắt.
  2. Nếu trường hợp ngoại lệ xảy ra và bị bắt và không bị ném hoặc ném mới.
  3. Bạn không thoát khỏi chức năng của mình từ khối catch.
  4. Đó là luôn ý tưởng hay là để (lại) ném bất kỳ ngoại lệ nào mà bạn không xử lý.
  5. Chúng tôi phải luôn rõ ràng trong xử lý ngoại lệ của chúng tôi. Có nghĩa là nếu bạn bắt ngoại lệ, hãy kiểm tra lỗi mà chúng tôi có thể xử lý bất kỳ điều gì khác phải là (lại) ném (n)

Cách tôi xử lý trường hợp của bạn là (lại) ném ngoại lệ từ câu lệnh thứ hai.

try { 
    $this->throwExceptionA(); 
    $this->throwExceptionB(); 

} catch (Exception $e) { 
    if($e->getMessage() == "ExceptionA Message") { 
     //Do handle code 

    } elseif($e->getMessage() == "ExceptionB Message") { 
     //Do other clean-up 
     throw $e; 

    } else { 
     //We should always do this or we will create bugs that elude us because 
     //we are catching exception that we are not handling 
     throw $e; 
    } 
} 
Các vấn đề liên quan