Hướng dẫn php try-finally without catch - php thử-cuối cùng mà không bắt được

Tôi đã thấy một số mã như thế này:

    try
    {
        db.store(mydata);
    }
    finally
    {
        db.cleanup();
    }

Tôi nghĩ try được cho là có catch?

Tại sao mã này làm theo cách này?

Hỏi ngày 10 tháng 4 năm 2010 lúc 18:37Apr 10, 2010 at 18:37

Hướng dẫn php try-finally without catch - php thử-cuối cùng mà không bắt được

1

Điều này rất hữu ích nếu bạn muốn phương pháp hiện đang thực hiện vẫn ném ngoại lệ trong khi cho phép các tài nguyên được làm sạch một cách thích hợp. Dưới đây là một ví dụ cụ thể về việc xử lý ngoại lệ từ phương thức gọi.

public void yourOtherMethod() {
    try {
        yourMethod();
    } catch (YourException ex) {
        // handle exception
    }
}    

public void yourMethod() throws YourException {
    try {
        db.store(mydata);
    } finally {
        db.cleanup();
    }
}

Đã trả lời ngày 10 tháng 4 năm 2010 lúc 18:39Apr 10, 2010 at 18:39

Taylor Leesetaylor LeeseTaylor Leese

49.6K27 Huy hiệu vàng109 Huy hiệu bạc140 Huy hiệu đồng27 gold badges109 silver badges140 bronze badges

3

Nó ở đó vì lập trình viên muốn đảm bảo rằng db.cleanup() được gọi ngay cả khi mã bên trong khối thử ném một ngoại lệ. Bất kỳ trường hợp ngoại lệ nào sẽ không được xử lý bởi khối đó, nhưng chúng sẽ chỉ được truyền lên sau khi khối cuối cùng được thực thi. Khối cuối cùng cũng sẽ được thực thi nếu không có ngoại lệ.

Đã trả lời ngày 10 tháng 4 năm 2010 lúc 18:39Apr 10, 2010 at 18:39

Taylor Leesetaylor LeeseMatti Virkkunen

49.6K27 Huy hiệu vàng109 Huy hiệu bạc140 Huy hiệu đồng9 gold badges122 silver badges157 bronze badges

1

Tại sao mã này làm theo cách này?

Hỏi ngày 10 tháng 4 năm 2010 lúc 18:37That’s fine – as long as one of the callers does, i.e. as long as the exception gets ultimately handled somewhere.

Điều này rất hữu ích nếu bạn muốn phương pháp hiện đang thực hiện vẫn ném ngoại lệ trong khi cho phép các tài nguyên được làm sạch một cách thích hợp. Dưới đây là một ví dụ cụ thể về việc xử lý ngoại lệ từ phương thức gọi.

Đã trả lời ngày 10 tháng 4 năm 2010 lúc 18:39

Taylor Leesetaylor LeeseApr 10, 2010 at 18:40

49.6K27 Huy hiệu vàng109 Huy hiệu bạc140 Huy hiệu đồngKonrad Rudolph

Nó ở đó vì lập trình viên muốn đảm bảo rằng db.cleanup() được gọi ngay cả khi mã bên trong khối thử ném một ngoại lệ. Bất kỳ trường hợp ngoại lệ nào sẽ không được xử lý bởi khối đó, nhưng chúng sẽ chỉ được truyền lên sau khi khối cuối cùng được thực thi. Khối cuối cùng cũng sẽ được thực thi nếu không có ngoại lệ.125 gold badges918 silver badges1194 bronze badges

Matti Virkkunenmatti Virkkunen

62.1K9 Huy hiệu vàng122 Huy hiệu bạc157 Huy hiệu đồng

try
{
    if (foo) return false;
    //bla ...
    return true;
}
finally
{
    //clean up
}

Bởi vì rõ ràng mã không biết cách xử lý các ngoại lệ ở cấp độ này. Điều đó rất tốt - miễn là một trong những người gọi, tức là miễn là ngoại lệ cuối cùng được xử lý ở đâu đó.

Thông thường, mã cấp thấp không thể phản ứng thích hợp với các ngoại lệ vì người dùng cần được thông báo hoặc ngoại lệ phải được ghi lại hoặc chiến lược khác phải được thử. Mã cấp thấp chỉ thực hiện một chức năng và không biết về việc ra quyết định cấp cao hơn.Apr 10, 2010 at 18:46

Nhưng mã vẫn cần phải làm sạch tài nguyên của nó (bởi vì nếu không có, chúng sẽ bị rò rỉ), vì vậy nó chỉ làm điều đó trong điều khoản finally, đảm bảo rằng nó luôn xảy ra, liệu một ngoại lệ có bị ném hay không.FRotthowe

Đã trả lời ngày 10 tháng 4 năm 2010 lúc 18:4024 silver badges31 bronze badges

Konrad Rudolphkonrad Rudolph
Usually, the way you would do it is to put all your database accessing code in the try block, and then put a call to close the database in the finally block.
The way try...finally works, means that the code in the try block is run, and the code in the finally block is run when that finishes...no matter what.
Short of the computer being yanked from the wall, the finally will execute.
This means that even if an exception is called, and the method takes three years to execute, it will still go in the finally block and the database will be closed.

514K125 Huy hiệu vàng918 Huy hiệu bạc1194 Huy hiệu đồngApr 10, 2010 at 18:49

Khối cuối cùng đảm bảo rằng ngay cả khi một RunTimeException bị ném (có thể là do một số lỗi trong mã được gọi là), cuộc gọi db.cleanup() sẽ được thực hiện.chustar

Điều này cũng thường được sử dụng để ngăn chặn quá nhiều làm tổ:24 gold badges80 silver badges118 bronze badges

Đặc biệt là khi có nhiều điểm mà phương thức trả về, điều này sẽ cải thiện khả năng đọc vì bất kỳ ai cũng có thể thấy mã làm sạch được gọi trong mọi trường hợp.

Đã trả lời ngày 10 tháng 4 năm 2010 lúc 18:46

FrotthowefrotthoweJan 11, 2018 at 13:30

Hướng dẫn php try-finally without catch - php thử-cuối cùng mà không bắt được