36

javaのようなtryandcatch機能を提供するモジュールErrorがあることがわかりました。しかし、返される例外をどのように出力できるかについて、私は混乱しています。

次の方法を理解したい

try {
    // do something that will fail!

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

スタックトレースでエラーの出力を取得するにはどうすればよいですか?

4

6 に答える 6

56

古いs の多くの落とし穴を回避するのに役立つTry::Tinyを使用する方がよいでしょう。perl

use Try::Tiny;

try {
        die "foo";
} catch {
        warn "caught error: $_";
};
于 2012-04-27T00:53:28.940 に答える
50

最後に確認したところ、エラーは非推奨でした。しかし、そのモジュールなしでそれを行う方法は次のとおりです。

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

基本的に、 の代わりに eval を使用し、 の代わりdie をtry使用throw、 で例外を探します$@。eval ブロッ​​クの最後の true 値は、$@5.14 より古いバージョンの Perl で再度使用される前に意図せずに変更されるのを防ぐためのイディオムの一部です。詳細については、P::C::P::ErrorHandling::RequireCheckingReturnValueOfEvalを参照してください。たとえば、このコードにはこの欠陥があります。

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

しかし、多くの Perl 操作は失敗しても例外を発生させないことに注意してください。エラーコードを返すだけです。この動作は、組み込みおよび標準モジュールのautodieを介して変更できます。を使用している場合autodie、try/catch を実行する標準的な方法は次のとおりです (autodie perldoc からそのまま):

use feature qw(switch);

eval {
   use autodie;

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

   my @records = <$fh>;

   # Do things with @records...

   close($fh);

};

given ($@) {
   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 を見てください

于 2012-04-26T23:57:14.247 に答える
8

Try::Tiny よりも少し強力なものが必要な場合は、CPAN のTryCatchモジュールを調べてみてください。

于 2013-06-06T18:58:03.480 に答える