2013-05-09 45 views
6

Điều này có thể thực hiện được trong PHP không?Phá vỡ khối try/catch

try{ 

    $obj = new Clas(); 

    if($obj->foo){ 
    // how to exit from this try block? 
    } 

    // do other stuff here 

}catch(Exception $e){ 

] 

Tôi biết tôi có thể đặt những thứ khác giữa {}, nhưng đó tăng thụt vào một khối mã lớn hơn và tôi không thích nó: P

+1

'ném (' Đưa tôi ra khỏi đây! ') 'Sẽ nhảy ra. nhưng đó không phải là chính xác. –

+3

bạn không thể sử dụng khác sau nếu được không? – mattfryercom

+0

@MattyF - +1, có vẻ như là câu trả lời cho tôi! – adeneo

Trả lời

3

Tôi biết điều này làm tăng thụt đầu dòng nhưng là một câu trả lời

try 
{ 
    $obj = new Clas(); 
    if ($obj->foo) 
    { 
     // do stuff here 
    } 
    else 
    { 
     // do other stuff here 
    } 
} 
catch (Exception $e) 
{ 
    // handle exceptions here 
} 
3

Không thể bạn chỉ cần làm như thế này?

try{ 

    $obj = new Clas(); 

    if(!$obj->foo){ 
    // do other stuff here 
    } 


}catch(Exception $e){ 

} 
7

Vâng, không có lý do cho điều đó, nhưng bạn có thể vui chơi buộc một ngoại lệ trong try khối của bạn, dừng thực hiện các chức năng của bạn.

try { 
    if ($you_dont_like_something){ 
    throw new Exception(); 
    //No code will be executed after the exception has been thrown. 
    } 
} catch (Exception $e){ 
    echo "Something went wrong"; 
} 
+0

Cân nhắc việc ném một lớp con cụ thể của Ngoại lệ, thay vì đối tượng Ngoại lệ cấp cao nhất. Sau đó, thêm đánh bắt cho các khả năng khác nhau. Tương tự như bình luận của Dan. – aaronbauman

11

Với goto tất nhiên!

try { 

    $obj = new Clas(); 

    if ($obj->foo) { 
    goto break_free_of_try; 
    } 

    // do other stuff here 

} catch(Exception $e) { 

} 
break_free_of_try: 
5

Tôi cũng phải đối mặt với tình trạng này, và giống như bạn, không muốn không biết bao nhiêu nếu/else if/else if/else vì nó làm cho mã dễ đọc hơn.

Tôi đã tự mình mở rộng lớp Ngoại lệ. Lớp ví dụ bên dưới dành cho các vấn đề xác thực khi được kích hoạt sẽ tạo ra 'thông báo đăng nhập' ít nghiêm trọng hơn

class ValidationEx extends Exception 
{ 
    public function __construct($message, $code = 0, Exception $previous = null) 
    { 
     parent::__construct($message, $code, $previous); 
    } 

    public function __toString() 
    { 
     return __CLASS__ . ": [{$this->code}]: {$this->message}\n"; 
    } 
} 

Trong mã chính của tôi, tôi gọi nó;

throw new ValidationEx('You maniac!'); 

Sau đó, ở phần cuối của báo cáo kết quả Thử Tôi có

 catch(ValidationEx $e) { echo $e->getMessage(); } 
     catch(Exception $e){ echo $e->getMessage(); } 

hạnh phúc để lấy ý kiến ​​và những lời chỉ trích, chúng tôi tất cả đây để tìm hiểu!

0

Trong php 5.3+ điều tốt đẹp về việc sử dụng ngoại lệ với khối try catch, là bạn có thể tạo ngoại lệ của riêng mình và xử lý chúng như thế nào và khi nào bạn muốn. Xem: Extending Exceptions

class AcceptedException extends \Exception 
{ 
    //... 
} 

Sau đó bạn có thể bắt ngoại lệ cụ thể hoặc sử dụng if ($e instanceof AcceptedException) trong catch \Exception khối của bạn để xác định cách bạn muốn xử lý các ngoại lệ (s).

  1. Cầm Ví dụ: http://ideone.com/ggz8fu
  2. Unhandled Ví dụ: http://ideone.com/luPQel
try { 
    $obj = (object) array('foo' => 'bar'); 
    if ($obj->foo) { 
     throw new \AcceptedException; 
    } 
} catch (\AcceptedException $e) { 
    var_dump('I was accepted'); 
} catch (\Exception $e) { 
    if ($e instanceof \InvalidArgumentException) { 
     throw $e; //don't handle the exception 
    } 
} 

Điều này làm cho mã của bạn nhiều hơn nữa có thể đọc được và dễ dàng hơn để khắc phục sự cố như trái ngược với rất nhiều giải pháp thay thế.