Perl - Xử lý lỗi
Việc thực thi và các lỗi luôn đi cùng nhau. Nếu bạn đang mở một tệp không tồn tại. thì nếu bạn không xử lý tình huống này đúng cách thì chương trình của bạn được coi là có chất lượng không tốt.
Chương trình dừng nếu xảy ra lỗi. Vì vậy, một xử lý lỗi thích hợp được sử dụng để xử lý các loại lỗi khác nhau, có thể xảy ra trong quá trình thực thi chương trình và thực hiện hành động thích hợp thay vì dừng chương trình hoàn toàn.
Bạn có thể xác định và mắc lỗi theo một số cách khác nhau. Nó rất dễ mắc lỗi trong Perl và sau đó xử lý chúng đúng cách. Dưới đây là một số phương pháp có thể được sử dụng.
Câu lệnh if
Các if statementlà lựa chọn hiển nhiên khi bạn cần kiểm tra giá trị trả về từ một câu lệnh; ví dụ -
if(open(DATA, $file)) {
...
} else {
die "Error: Couldn't open the file - $!";
}
Đây là biến $! trả về thông báo lỗi thực tế. Ngoài ra, chúng ta có thể giảm câu lệnh xuống một dòng trong những tình huống mà việc làm như vậy là hợp lý; ví dụ -
open(DATA, $file) || die "Error: Couldn't open the file $!";
Chức năng trừ khi
Các unlesshàm ngược lại logic với câu lệnh if: hoàn toàn có thể bỏ qua trạng thái thành công và chỉ được thực thi nếu biểu thức trả về false. Ví dụ -
unless(chdir("/etc")) {
die "Error: Can't change directory - $!";
}
Các unlesscâu lệnh được sử dụng tốt nhất khi bạn chỉ muốn nêu ra lỗi hoặc thay thế nếu biểu thức không thành công. Câu lệnh cũng có ý nghĩa khi được sử dụng trong câu lệnh một dòng -
die "Error: Can't change directory!: $!" unless(chdir("/etc"));
Ở đây chúng ta chỉ chết nếu thao tác chdir không thành công và nó đọc tốt.
Toán tử bậc ba
Đối với các bài kiểm tra rất ngắn, bạn có thể sử dụng toán tử điều kiện ?:
print(exists($hash{value}) ? 'There' : 'Missing',"\n");
Ở đây không quá rõ ràng những gì chúng tôi đang cố gắng đạt được, nhưng hiệu quả giống như việc sử dụng if hoặc là unlesstuyên bố. Toán tử điều kiện được sử dụng tốt nhất khi bạn muốn nhanh chóng trả về một trong hai giá trị trong một biểu thức hoặc câu lệnh.
Chức năng cảnh báo
Chức năng cảnh báo chỉ đưa ra cảnh báo, một thông báo được in ra STDERR, nhưng không có hành động nào khác được thực hiện. Vì vậy, sẽ hữu ích hơn nếu bạn chỉ muốn in cảnh báo cho người dùng và tiến hành phần còn lại của hoạt động -
chdir('/etc') or warn "Can't change directory";
Hàm chết
Hàm die hoạt động giống như warning, ngoại trừ nó cũng gọi exit. Trong một tập lệnh bình thường, hàm này có tác dụng kết thúc thực thi ngay lập tức. Bạn nên sử dụng chức năng này trong trường hợp không thể tiếp tục nếu có lỗi trong chương trình -
chdir('/etc') or die "Can't change directory";
Lỗi trong Mô-đun
Có hai tình huống khác nhau mà chúng ta có thể xử lý -
Báo cáo lỗi trong mô-đun trích dẫn tên tệp và số dòng của mô-đun - điều này hữu ích khi gỡ lỗi mô-đun hoặc khi bạn đặc biệt muốn nêu ra lỗi liên quan đến mô-đun, thay vì liên quan đến tập lệnh.
Báo cáo lỗi trong mô-đun trích dẫn thông tin của người gọi để bạn có thể gỡ lỗi dòng trong tập lệnh gây ra lỗi. Các lỗi được nêu ra theo kiểu này rất hữu ích cho người dùng cuối, vì chúng làm nổi bật lỗi liên quan đến dòng khởi đầu của tập lệnh gọi.
Các warn và diecác hàm hoạt động hơi khác so với bạn mong đợi khi được gọi từ bên trong một mô-đun. Ví dụ, mô-đun đơn giản -
package T;
require Exporter;
@ISA = qw/Exporter/;
@EXPORT = qw/function/;
use Carp;
sub function {
warn "Error in module!";
}
1;
Khi được gọi từ một tập lệnh như dưới đây -
use T;
function();
Nó sẽ tạo ra kết quả sau:
Error in module! at T.pm line 9.
Đây ít nhiều là những gì bạn có thể mong đợi, nhưng không nhất thiết là những gì bạn muốn. Từ quan điểm của lập trình viên mô-đun, thông tin hữu ích vì nó giúp chỉ ra một lỗi trong chính mô-đun. Đối với người dùng cuối, thông tin được cung cấp là khá vô dụng, và đối với tất cả, trừ những lập trình viên chăm chỉ, nó hoàn toàn vô nghĩa.
Giải pháp cho những vấn đề này là mô-đun Carp, cung cấp một phương pháp đơn giản để báo cáo lỗi trong các mô-đun trả về thông tin về tập lệnh gọi. Mô-đun Cá chép cung cấp bốn chức năng: cá chép, kêu, kêu và thú nhận. Các chức năng này được thảo luận dưới đây.
Chức năng cá chép
Chức năng cá chép là tương đương cơ bản của cảnh báo và in thông báo tới STDERR mà không thực sự thoát tập lệnh và in tên tập lệnh.
package T;
require Exporter;
@ISA = qw/Exporter/;
@EXPORT = qw/function/;
use Carp;
sub function {
carp "Error in module!";
}
1;
Khi được gọi từ một tập lệnh như dưới đây -
use T;
function();
Nó sẽ tạo ra kết quả sau:
Error in module! at test.pl line 4
Chức năng cluck
Hàm cluck là một loại cá chép tăng áp, nó tuân theo nguyên tắc cơ bản tương tự nhưng cũng in dấu vết ngăn xếp của tất cả các mô-đun dẫn đến hàm được gọi, bao gồm cả thông tin trên tập lệnh gốc.
package T;
require Exporter;
@ISA = qw/Exporter/;
@EXPORT = qw/function/;
use Carp qw(cluck);
sub function {
cluck "Error in module!";
}
1;
Khi được gọi từ một tập lệnh như dưới đây -
use T;
function();
Nó sẽ tạo ra kết quả sau:
Error in module! at T.pm line 9
T::function() called at test.pl line 4
Hàm croak
Các croak chức năng tương đương với die, ngoại trừ việc nó báo cáo người gọi lên một cấp. Giống như die, hàm này cũng thoát tập lệnh sau khi báo lỗi cho STDERR -
package T;
require Exporter;
@ISA = qw/Exporter/;
@EXPORT = qw/function/;
use Carp;
sub function {
croak "Error in module!";
}
1;
Khi được gọi từ một tập lệnh như dưới đây -
use T;
function();
Nó sẽ tạo ra kết quả sau:
Error in module! at test.pl line 4
Đối với cá chép, các quy tắc cơ bản tương tự được áp dụng liên quan đến việc bao gồm thông tin dòng và tệp theo các chức năng cảnh báo và chết.
Chức năng thú nhận
Các confess chức năng giống như cluck; nó gọi die và sau đó in ra một dấu vết ngăn xếp cho đến tập lệnh gốc.
package T;
require Exporter;
@ISA = qw/Exporter/;
@EXPORT = qw/function/;
use Carp;
sub function {
confess "Error in module!";
}
1;
Khi được gọi từ một tập lệnh như dưới đây -
use T;
function();
Nó sẽ tạo ra kết quả sau:
Error in module! at T.pm line 9
T::function() called at test.pl line 4