2008-10-09 35 views

Trả lời

42

cá chép mang đến cho bạn biết thêm như để nơi thông điệp xuất phát từ (bối cảnh)

#!/usr/bin/perl 

use Carp; 

foo(); 
bar(); 
baz(); 

sub foo { 
    warn "foo"; 
} 

sub bar { 
    carp "bar"; 
} 

sub baz { 
    foo(); 
    bar(); 
} 

sản xuất

foo at ./foo.pl line 9. 
bar at ./foo.pl line 13 
     main::bar() called at ./foo.pl line 6 
foo at ./foo.pl line 10. 
bar at ./foo.pl line 14 
     main::bar() called at ./foo.pl line 19 
     main::baz() called at ./foo.pl line 7 

kinda ngớ ngẩn cho chương trình nhỏ này nhưng có ích khi bạn muốn biết ai gọi là phương pháp đó là carp'ing.

12

cá chép hoạt động tốt hơn để gỡ lỗi trong các mô-đun. Nếu bạn chỉ viết một kịch bản đơn giản, không có lợi ích. Từ the Carp documenation:

Quy trình cá chép hữu ích trong mô-đun của riêng bạn vì chúng hoạt động như die() hoặc cảnh báo() nhưng có nhiều khả năng hữu ích cho người dùng của mô-đun của bạn. Trong trường hợp của cluck, thú nhận, và longmess bối cảnh đó là một bản tóm tắt của mọi cuộc gọi trong ngăn xếp cuộc gọi. Đối với một tin nhắn ngắn hơn, bạn có thể sử dụng cá chép hoặc croak báo cáo lỗi là từ nơi mà module của bạn được gọi. Không có gì đảm bảo rằng đó là nơi lỗi xảy ra, nhưng đó là một phỏng đoán được giáo dục tốt.

22

Tôi sử dụng warn cho tập lệnh và chương trình đơn giản và Carp bên trong bất kỳ mô-đun nào. Các chương trình con Carp sử dụng tên tệp và số dòng nơi chương trình con hiện tại của bạn được gọi để dễ tìm ra ai đang gây ra sự cố (không chỉ ở nơi sự cố được thể hiện).

Damian khuyến Carp thay vì warn trong "Báo cáo Failure" trong Perl Thực tiễn tốt nhất, nhưng không làm cho sự khác biệt giữa các kịch bản như cấu trúc mã cấp cao nhất và các module như các thành phần mà chương trình sử dụng.

Tôi hầu như không quan tâm đến điều đó gần đây vì tôi đã sử dụng Log::Log4perl để xử lý tất cả điều đó.

8

Carp báo cáo lỗi từ góc nhìn của người gọi. Điều này hữu ích cho các mô-đun mà bạn thường muốn cảnh báo về việc sử dụng không chính xác (ví dụ: một đối số bị thiếu) và xác định địa điểm xảy ra lỗi xảy ra trái ngược với nơi phát hiện . Điều này đặc biệt quan trọng đối với các chức năng tiện ích có thể được sử dụng ở nhiều nơi.

Hầu hết các tác giả sử dụng warn trong tập lệnh và trong mô-đun. Thỉnh thoảng, tôi sử dụng warn bên trong một mô-đun khi tôi muốn thông báo lỗi phản ánh sự cố trong quá trình triển khai của mô-đun (ví dụ: trường hợp cần hỗ trợ nhưng không.) Có thể cho rằng cluck sẽ tốt hơn trong các trường hợp như vậy stack backtrace.

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