2011-06-23 43 views
10

Tôi đang làm tổ cố gắng nắm bắt bên trong của một tuyên bố cố gắng chính, những gì tôi muốn biết là làm thế nào tôi có thể làm cho thử chính bắt thất bại nếu một trong những thử bắt lồng nhau không thành công?Làm thế nào để vượt qua ngoại lệ bắt trong bắt bên trong để nắm bắt bên ngoài trong một thử bắt lồng nhau

Đây là mã của tôi:

try 
{  
    try 
    { 
     //how can I make the main try catch fail if this try catch fails? 
    } 
    catch(Exception $e) 
    { 
     error_log(); 
    }  
} 
catch(Exception $e) 
{ 
    error_log(); 
} 

Trả lời

18

Sau error_log(); trong try-catch đầu tiên, gõ throw $e; (trên một dòng mới). Điều này sẽ ném lỗi một lần nữa, và bên ngoài try-catch sẽ xử lý nó.

2

Bên trong bắt bên trong, ném() - KHÔNG được khuyến nghị, tôi đã thấy một số vấn đề với PHP khi thực hiện việc này. Hoặc thiết lập một lá cờ để ném ngay sau khi bắt bên trong.

Dưới đây là một ví dụ ném cùng một ngoại lệ (hoặc bạn có thể ném một ngoại lệ khác).

try { 
    $ex = null; 
    try { 
     //how can I make the main try catch fail if this try catch fails? 
    } catch(Exception $e){ 
     $ex = $e; 
     error_log(); 
    } 

    if ($ex) { 
     throw $ex; 
    } 

} catch(Exception $e){ 
    error_log(); 
} 
0

sử dụng một biến bool và "trở lại" từ khóa ở vị trí thích hợp có thể làm các trick cho bạn ...

+1

Điểm chính là chuyển điều khiển sang bên ngoài 'bắt' sau khi chạy phần bên trong. Một 'return' sẽ bỏ qua nó hoàn toàn. – cHao

5

Bạn nên mở rộng ngoại lệ cho các loại khác nhau khác nhau của ngoại lệ. Bằng cách đó bạn có thể kích hoạt một khối try-catch cụ thể:

try 
{ 
    ... 
    try 
    { 
    throwSomeException(); 
    } 
    catch (InnerException $e) 
    { 
    ...do stuff only for InnerException... 
    } 
    ... 
} 
catch (Exception $e) 
{ 
    ...do stuff for all types of exception... 
} 

Ngoài ra, bạn có thể chuỗi catch báo cáo của bạn để kích hoạt các khối khác nhau trong một try-catch duy nhất:

try 
{ 
    ... 
} 
catch (SpecificTypeOfException $e) 
{ 
    ..do something specific 
} 
catch (TypeOfException $e) 
{ 
    ..do something less specific 
} 
catch (Exception $e) 
{ 
    ..do something for all exceptions 
} 
0

tôi xử lý ngoại lệ trong một cách tương tự như eventHandling trong Javascript. Một sự kiện sẽ làm bong bóng các bậc thang từ cụ thể đến chung chung. Khi nó đạt đến chương trình bắt đầu, một ngoại lệ bị mất tất cả ý nghĩa của nó đối với mã và chỉ đơn giản là bị bắt để ghi nhật ký và kết thúc một ứng dụng.

Trong khi đó rất nhiều thứ có thể xảy ra

callstack:

  • Bắt đầu trưa
  • Ăn Apple (Trước khi mã này, một quả táo đã được mua như ăn trưa)
  • răng Chìm trong apple

Trong khi ăn táo, một con giun xuất hiện:

throw NausiaException('I found a bleeding worm...'); 

Ăn phạm vi của Apple bắt

catch(Exception $e) 

ngoại trừ bởi vì trong phạm vi mà chúng ta có thể trả lại táo đến cửa hàng và hét vào người quản lý. Vì không có gì hữu ích hơn có thể nói về sự xuất hiện,

throw $e 

được gọi là vì ăn táo không thành công.

Something có thể đã đi khác nhau Tuy nhiên, nếu người quản lý cửa hàng từ chối hoàn lại tiền, bạn có thể quấn ngoại lệ

throw new RefundFailedException('The manager is a cheap skate', RefundFailedException::REFUSED, $e) 

Bắt đầu ăn trưa Phạm vi Bắt đầu phạm vi trưa muốn ném trưa đi xấu

try { 
    //Start lunch 
} catch (Exception $e) { 
    switch (true) { 
     case $e instanceof NausiaException: 
     case $e instanceof RefundFailedException: 
      //Throw lunch away 
      break; 
    } 
} 
Các vấn đề liên quan