2012-04-26 10 views
23

मुझे पता चला है कि मॉड्यूल Error है जो जावा में प्रयास करने और पकड़ने की कार्यक्षमता प्रदान करता है। लेकिन मैं उलझन में हूं कि आप रिटर्न को अपवाद कैसे प्रिंट कर सकते हैं।त्रुटि.pm प्रदान करता है कि perl में प्रयास पकड़ का सही ढंग से उपयोग कैसे करें?

मैं कैसे निम्नलिखित

try { 
    // do something that will fail! 

} catch (Error e) { 
    // Print out the exception that occurred 
    System.out.println(e.getMessage()); 
} 

मैं स्टैक ट्रेस के साथ त्रुटि के प्रिंट कैसे मिलता है ऐसा करने के लिए समझने के लिए चाहते हैं?

उत्तर

40

आप शायद Try::Tiny का उपयोग कर बेहतर हैं जो आपको pitfalls with older perls से बचने में मदद करेगा।

use Try::Tiny; 

try { 
     die "foo"; 
} catch { 
     warn "caught error: $_"; 
}; 
+0

मैं इस चेतावनी को लॉग में कैसे डंप करूं? – pitchblack408

+0

क्या मैं अपवाद बना सकता हूं? – pitchblack408

+1

मुझे यकीन नहीं है कि आप क्या पूछ रहे हैं। आप उन्हें लॉग इन करके लॉग फ़ाइलों में चीजें डंप करते हैं और आप 'die' या' croak' का उपयोग करके अपवाद बनाते हैं। क्या आप अपवाद वस्तुओं आदि को एक साथ कैसे रखना चाहते हैं? यह एक अलग सवाल होगा। –

36

अंतिम बार मैंने चेक किया, Error बहिष्कृत किया गया था। लेकिन यहाँ आप इसे कैसे कि मॉड्यूल के बिना करना होगा है:

eval { 
    die "Oops!"; 
    1; 
} or do { 
    my $e = [email protected]; 
    print("Something went wrong: $e\n"); 
}; 

असल में, eval बजाय try, diethrow के बजाय का उपयोग करें, और [email protected] में अपवाद के लिए लग रही है। Eval ब्लॉक के अंत में सही मान [email protected] को अनजाने में बदलने से रोकने के लिए एक मुहावरे का हिस्सा है, जिसका उपयोग 5.14 से पुराने पर्ल संस्करणों में फिर से किया जाता है, विवरण के लिए P::C::P::ErrorHandling::RequireCheckingReturnValueOfEval देखें। उदाहरण के लिए, यह कोड इस दोष से पीड़ित है।

# BAD, DO NOT USE WITH PERLS OLDER THAN 5.14 
eval { 
    die "Oops!"; 
}; 
if (my $e = [email protected]) { 
    print("Something went wrong: $e\n"); 
} 
# BAD, DO NOT USE WITH PERLS OLDER THAN 5.14 

लेकिन ध्यान दें कि कई पर्ल संचालन अपवाद जब वे असफल न बढ़ाएं; वे बस एक त्रुटि कोड लौटते हैं। बिल्टिन और मानक मॉड्यूल के लिए इस व्यवहार को autodie के माध्यम से बदला जा सकता है। आप autodie उपयोग कर रहे हैं, तो ट्राई/कैच करने का मानक तरीका यह है (सीधे autodie perldoc में से):

use feature qw(switch); 

eval { 
    use autodie; 

    open(my $fh, '<', $some_file); 

    my @records = <$fh>; 

    # Do things with @records... 

    close($fh); 

}; 

given ([email protected]) { 
    when (undef) { say "No error";     } 
    when ('open') { say "Error from open";    } 
    when (':io') { say "Non-open, IO error.";   } 
    when (':all') { say "All other autodie errors." } 
    default  { say "Not an autodie error at all." } 
} 

एक स्टैकट्रेस हो रही के लिए, Carp को देखो।

+0

देखें [कोशिश करें :: छोटे 'दस्तावेज़ों में बैकग्राउंड अनुभाग] (http://search.cpan.org/perldoc/Try::Tiny#BACKGROUND) उन समस्याओं के लिए जिन्हें आप पुरानी' perl 'के साथ चला सकते हैं अपवाद हैंडलिंग के लिए 'eval' का उपयोग करना। –

+0

[अपवाद हैंडलिंग 5.14.0 में तय की गई थी] (http://search.cpan.org/perldoc/perl5140delta#Exception_Handling) –

+0

मैं पेर्ल के लिए नया हूं, मैं कैसे पता लगा सकता हूं कि बहिष्कृत क्या है? मैं eval का उपयोग नहीं करना चाहता {क्योंकि यह प्राकृतिक महसूस नहीं करता है। मैं जावा/सी ++/सी # पृष्ठभूमि से आया हूं। तो, अगर मैं कोशिश :: टिनी में स्थानांतरित करता हूं जो कि नया और अधिक स्थिर है? – pitchblack408

5

आप कुछ से प्रयास करें :: छोटे और अधिक शक्तिशाली चाहते हैं, आप CPAN में TryCatch मॉड्यूल को देखने का प्रयास कर सकते हैं।

संबंधित मुद्दे