2012-05-04 21 views
5

cấu trúc này là khá phổ biến trong perl:perl "hoặc" xử lý lỗi: đa tuyên bố về lỗi có thể?

opendir (B,"/somedir") or die "couldn't open dir!"; 

Nhưng điều này dường như không làm việc:

opendir (B, "/does-not-exist ") or { 
    print "sorry, that directory doesn't exist.\n"; 
    print "now I eat fugu.\n"; 
    exit 1; 
}; 

Có thể cho "hoặc" Lỗi xử lý để có nhiều hơn một lệnh?

Biên dịch trên:

# perl -c test.pl 
syntax error at test.pl line 5, near "print" 
syntax error at test.pl line 7, near "}" 
test.pl had compilation errors. 
+2

Lỗi in phải được gửi cho 'STDERR', và bạn nên sử dụng' die' thay vì '+' print' exit'. – ikegami

Trả lời

14

Bạn luôn có thể sử dụng do:

opendir (B, "/does-not-exist ") or do { 
    print "sorry, that directory doesn't exist.\n"; 
    print "now I eat fugu.\n"; 
    exit 1; 
} 

Hoặc bạn có thể sử dụng nếu/trừ:

unless (opendir (B, "/does-not-exist ")) { 
    print "sorry, that directory doesn't exist.\n"; 
    print "now I eat fugu.\n"; 
    exit 1; 
} 

Hoặc bạn có thể xoay cùng của riêng bạn chương trình con:

opendir (B, "/does-not-exist ") or fugu(); 

sub fugu { 
    print "sorry, that directory doesn't exist.\n"; 
    print "now I eat fugu.\n"; 
    exit 1; 
} 

Có nhiều cách để thực hiện.

+0

Ví dụ: "thường xuyên hơn" không hoạt động, nếu người dùng sử dụng 'mở (my $ B, ...)'. – ikegami

+0

@ikegami Vâng, nó * làm * công việc, nó sẽ không có hiệu quả. Với việc xử lý tệp chung, nó không quan trọng. – TLP

+0

@TLP ngoài vấn đề phạm vi, tại sao bạn xem xét giải pháp "trừ khi" không được đề xuất? –

-2

xử lý ngoại lệ trong Perl được thực hiện với eval()

eval { 
    ... 
} or do { 
    ...Use [email protected] to handle the error... 
}; 
+0

'mở' không chết, nó chỉ trả về' undef'. Không có gì để bắt bằng cách sử dụng 'eval'. – chepner