名前

Mojo::Exception - 状況つきの例外

Mojo::Exceptionは状況の情報のついた例外のためのコンテナです。

使い方

use Mojo::Exception;

# 例外を投げて、スタックトレースを表示
eval { Mojo::Exception->throw('Something went wrong!') };
say "$_->[1]:$_->[2]" for @{$@->frames};

# 例外のカスタマイズ
eval {
my $e = Mojo::Exception->new('Died at test.pl line 3.');
die $e->trace(2)->inspect->verbose(1);
};
say $@;

属性

Mojo::Exceptionは次の属性を実装しています。

frames

my $frames = $e->frames;
$e         = $e->frames([$frame1, $frame2]);

スタックトレース(もし利用可能であれば)。

# 最後のフレームからの情報を抽出
my ($package, $filename, $line, $subroutine, $hasargs, $wantarray, $evaltext,
$is_require, $hints, $bitmask, $hinthash) = @{$e->frames->[-1]};

line

my $line = $e->line;
$e       = $e->line([3, 'foo']);

例外が発生した行(もし利用可能であれば)。

lines_after

my $lines = $e->lines_after;
$e        = $e->lines_after([ [1, 'bar'], [2, 'baz'] ]);

例外が発生したラインの後の数行(もし利用可能であれば)。

lines_before

my $lines = $e->lines_before;
$e        = $e->lines_before([ [4, 'bar'], [5, 'baz'] ]);

例外が発生した行の前の数行。

message

my $message = $e->message;
$e          = $e->message('Oops!');

例外メッセージ。

verbose

my $bool = $e->verbose;
$e       = $e->verbose($bool);

詳細な描画を有効にします。デフォルトはMOJO_EXCEPTION_VERBOSEの値か0です。

メソッド

Mojo::ExceptionMojo::Baseのすべてのメソッドを継承しており、 次の新しいメソッドを実装しています。

inspect

$e = $e->inspect;
$e = $e->inspect($source1, $source2);

「lines_before」と「line」と「lines_after」をコンテキスト情報で満たすために、 「message」と「frames」とオプショナルな追加のソースを検査します。

new

my $e = Mojo::Exception->new;
my $e = Mojo::Exception->new('Died at test.pl line 3.');

新しいMojo::Exceptionオブジェクトを生成し、必要であれば、メッセージを設定します。

to_string

my $string = $e->to_string;

例外を描画します。

throw

Mojo::Exception->throw('Oops!');
Mojo::Exception->throw('Oops!', $files);

スタックトレースつきの例外を発生させます。

trace

$e = $e->trace;
$e = $e->trace($skip);

スタックトレースを保存します。デフォルトでは、1コールフレームをスキップします。

# 3コールフレームをスキップ
$e->trace(3);

# コールフレームをスキップしない
$e->trace(0);

演算子

Mojo::Exceptionは次の演算子をオーバーロードしています。

ブール

my $bool = !!$e;

いつでも真。

文字列化

my $str = "$e";

to_stringのエイリアス。

参考

Mojolicious, Mojolicious::Guides, http://mojolicio.us.

(Mojolicious 8.12を反映。2019年5月14日)