Câu trả lời của tôi là không phổ biến, nhưng tôi không nghĩ rằng các lập trình viên Perl nên cố gắng sử dụng khái niệm cực kỳ tồi tệ về thứ mà chúng ta gọi là "ngoại lệ" trong Perl. Đây thực chất là giá trị trả về kênh phụ. Tuy nhiên, vẫn còn say mê với ý tưởng về các ngoại lệ, ngay cả với tất cả sự phức tạp của việc sử dụng một biến toàn cục để chuyển xung quanh trạng thái, mọi người vẫn tiếp tục cố gắng làm cho nó hoạt động.
Tuy nhiên, trên thực tế, mọi người sử dụng die
để báo hiệu sự thất bại. Một số người sẽ nói rằng bạn có thể die
với một tham chiếu và trả lại các đối tượng lỗi, nhưng bạn không cần die
điều đó. Chúng ta có các đối tượng, vì vậy chúng ta nên sử dụng tất cả sức mạnh của các đối tượng:
sub some_sub {
...
return Result->new( error => 1, description => ... ) if $something_went_wrong;
return Result->new( error => 0, ... );
}
my $result = some_sub( ... );
if( $result->is_error ) { ... };
Điều đó không liên quan đến các biến toàn cục, hành động ở khoảng cách xa, đau đầu trong phạm vi hoặc yêu cầu đặc biệt đặc biệt. Bạn tạo một lớp nhỏ Result
, hoặc bất cứ thứ gì bạn muốn gọi nó, để bọc các giá trị trả về của bạn để bạn có dữ liệu có cấu trúc thay vì các giá trị đơn lẻ không có danh tính. Không còn thắc mắc giá trị trả về có nghĩa là gì. Đó là undef
giá trị thực hay là dấu hiệu của sự thất bại? Giá trị trả về có tốt không nếu nó được xác định hoặc nếu nó đúng? Đối tượng của bạn có thể cho bạn biết những điều này. Và, bạn có thể sử dụng cùng một đối tượng vớidie
. Nếu bạn đã sử dụng đối tượng với die
và sử dụng nó làm giá trị trả về, thì có rất ít điều để giới thiệu tất cả những thứ bổ sung mà bạn phải làm để dung nạp$@
.
Tôi nói thêm về điều này trong "Trả lại các đối tượng lỗi thay vì ném các ngoại lệ"
Tuy nhiên, tôi biết rằng bạn không thể giúp những gì người khác làm, vì vậy bạn vẫn phải giả vờ Perl có ngoại lệ.