2013-06-25 34 views
17

Hãy xem xét hai ví dụ nàyTừ khóa `cuối cùng` trong PHP là gì?

<?php 
function throw_exception() { 
    // Arbitrary code here 
    throw new Exception('Hello, Joe!'); 
} 

function some_code() { 
    // Arbitrary code here 
} 

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

some_code(); 

// More arbitrary code 
?> 

<?php 
function throw_exception() { 
    // Arbitrary code here 
    throw new Exception('Hello, Joe!'); 
} 

function some_code() { 
    // Arbitrary code here 
} 

try { 
    throw_exception(); 
} catch (Exception $e) { 
    echo $e->getMessage(); 
} finally { 
    some_code(); 
} 

// More arbitrary code 
?> 

sự khác biệt là gì? Có một tình huống mà ví dụ đầu tiên sẽ không thực hiện some_code(), nhưng thứ hai sẽ? Tôi có thiếu điểm hoàn toàn không?

+4

'Mã trong khối finally sẽ luôn được thực hiện sau khi thử và nắm bắt khối, bất kể một ngoại lệ đã được ném ra, và trước khi thực hiện bình thường resumes.' –

+0

Tôi nghĩ rằng đây có liên quan về chủ đề này: http://stackoverflow.com/questions/15031515/can-i-use-try-catch-finally-like-this – JunM

+0

Chỉ để lưu bất kỳ ai khác sao chép-dán từ hướng dẫn sử dụng PHP, tôi đã đọc nhưng không hiểu sự khác biệt giữa hai ví dụ này, nếu không tôi sẽ không hỏi câu hỏi. – marxjohnson

Trả lời

37

Nếu bạn bắt ngoại lệ (ngoại trừ bất kỳ) hai mẫu mã là tương đương. Nhưng nếu bạn chỉ xử lý một số loại ngoại lệ cụ thể trong khối lớp học của mình và một loại ngoại lệ khác xảy ra, thì some_code(); sẽ chỉ được thực thi nếu bạn có khối finally.

try { 
    throw_exception(); 
} catch (ExceptionTypeA $e) { 
    echo $e->getMessage(); 
} 

some_code(); // Will not execute if throw_exception throws an ExceptionTypeB 

nhưng:

try { 
    throw_exception(); 
} catch (ExceptionTypeA $e) { 
    echo $e->getMessage(); 
} finally { 
    some_code(); // Will be execute even if throw_exception throws an ExceptionTypeB 
} 
+1

Đánh giá +1 để trích dẫn một trường hợp cụ thể khi 'some_code()' sẽ không được thực thi –

+0

Rất rõ ràng và hữu ích ... –

+0

Tôi đã dành một chút thời gian nghiên cứu tại sao chúng hữu ích và cuối cùng (không có ý định chơi chữ), câu trả lời của bạn đưa ra một lý do hợp lệ cho sự cần thiết của một khối cuối cùng. –

-1

http://www.youtube.com/watch?v=EWj60p8esD0

Watch từ: 12:30 trở đi

Xem video này. Ngôn ngữ là JAVA. Nhưng tôi nghĩ rằng nó minh họa Ngoại lệ và việc sử dụng cuối cùng là từ khóa rất tốt.

+0

Cảm ơn soden, giải thích những gì tôi đã biết, tức là nó chạy bất kể cho dù có một ngoại lệ. Nhưng mã được đặt sau khối, phải không? Có một lợi thế cụ thể để có nó như là một phần của khối? – marxjohnson

+0

Phụ thuộc vào số tiền bạn muốn ngoại lệ được trừu tượng hóa từ người dùng. Nói chung sử dụng cuối cùng là một hiếm. – sodhancha

0

fianlly khối được sử dụng khi bạn muốn có một đoạn mã để thực hiện bất kể một ngoại lệ xảy ra hay không ...

Check-out Ví dụ 2 trên trang này:

PHP manual

0

Cuối cùng sẽ kích hoạt ngay cả khi không có ngoại lệ đã bị bắt.

Hãy thử mã này để xem lý do tại sao:

<?php 
class Exep1 extends Exception {} 
class Exep2 extends Exception {} 

try { 
    echo 'try '; 
    throw new Exep1(); 
} catch (Exep2 $e) 
{ 
    echo ' catch '; 
} finally { 
    echo ' finally '; 
} 

echo 'aftermath'; 

?> 

sản lượng sẽ được

try finally 
Fatal error: Uncaught exception 'Exep1' in /tmp/execpad-70360fffa35e/source-70360fffa35e:7 
Stack trace: 
#0 {main} 
    thrown in /tmp/execpad-70360fffa35e/source-70360fffa35e on line 7 

đây là fiddle cho bạn. https://eval.in/933947

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