]>
git.proxmox.com Git - pve-common.git/blob - data/PVE/Exception.pm
3 # a way to add more information to exceptions (see man perlfunc (die))
4 # use PVE::Exception qw(raise);
5 # raise ("my error message", code => 400, errors => { param1 => "err1", ...} );
7 package PVE
::Exception
;
10 use vars
qw(@ISA @EXPORT_OK);
12 use Storable
qw(dclone);
13 use HTTP
::Status
qw(:constants);
17 use overload
'""' => sub {local $@; shift-
>stringify};
18 use overload
'cmp' => sub {
21 return "$a" cmp "$b"; # compare as string
24 @EXPORT_OK = qw(raise raise_param_exc);
27 my ($class, $msg, %param) = @_;
29 $class = ref($class) || $class;
35 foreach my $p (keys %param) {
36 next if defined($self->{$p});
38 $self->{$p} = ref($v) ? dclone
($v) : $v;
46 my $exc = PVE
::Exception-
>new(@_);
48 my ($pkg, $filename, $line) = caller;
50 $exc->{filename
} = $filename;
59 return $self->{code
} && $self->{code
} eq HTTP_BAD_REQUEST
;
63 my ($errors, $usage) = @_;
66 code
=> HTTP_BAD_REQUEST
,
70 $param->{usage
} = $usage if $usage;
72 my $exc = PVE
::Exception-
>new("Parameter verification failed.\n", %$param);
74 my ($pkg, $filename, $line) = caller;
76 $exc->{filename
} = $filename;
85 my $msg = $self->{code
} ?
"$self->{code} $self->{msg}" : $self->{msg
};
89 if ($self->{filename
} && $self->{line
}) {
90 $msg .= " at $self->{filename} line $self->{line}";
96 if ($self->{errors
}) {
97 foreach my $e (keys %{$self->{errors
}}) {
98 $msg .= "$e: $self->{errors}->{$e}\n";
102 if ($self->{propagate
}) {
103 foreach my $pi (@{$self->{propagate
}}) {
104 $msg .= "\t...propagated at $pi->[0] line $pi->[1]\n";
108 if ($self->{usage
}) {
109 $msg .= $self->{usage
};
110 $msg .= "\n" if $msg !~ m/\n$/;
117 my ($self, $file, $line) = @_;
119 push @{$self->{propagate
}}, [$file, $line];