Thread Jeder kennt Traits (54 answers)
Opened by rosti at 2018-11-06 11:05

rosti
 2018-11-16 10:16
#189210 #189210
User since
2011-03-19
3194 Artikel
BenutzerIn
[Homepage]
user image
Genau, da haben wir ja die Instanz, danke Dir!!

Und was Exception::Class betrifft: Ich baue gerade eine abgespeckte Version für mein FW. Aber nicht als Klasse sondern als Trait. So ist die Exception Klasse die beim Wurf angegeben wird, nur eine virtuelle Klasse.

Der Trait sieht bisher so aus;

Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
# Trait for Handle Excepions via virtuell Exception Classes

use strict;
use warnings;
use Devel::StackTrace;

# FW Methode
sub throw{
    my $self = shift;
    my $class = shift;
    my $msg = shift;
    eval{ die "$msg\n" };
    chomp $@;
    $self->{exceptions}{$class} = {
        error => $@,
        trace => Devel::StackTrace->new
    };
    die "$msg\n";
}

# FW Methode
sub caught{
    my $self = shift;
    my $class = shift;
    bless $self->{exceptions}{$class}, __PACKAGE__;
}

# EX Methode 
sub error{
    my $self = shift;
    $self->{error};    
}

# EX Methode
sub trace{
    my $self = shift;
    $self->{trace}->as_string;
}
1;


Ist aber noch nicht fertig, da fehlt noch die Fehlerbehandlung. Charakteristisch für einen Trait auch, daß er Methoden für Instanzen verschiedener Klassen definiert. Welche das sind hab ich mal kommentiert.

Beim Aufruf also kannst Du hiermit die Exceptions klassifizieren:

Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
use throw; # Trait

$, = "\n";
my $main = bless{};

try{
    $main->throw('MyExClass',"Invalid!");
}
catch{
    my $exa = $main->caught('MyExClass');
    print $exa->error, $exa->trace;
};


und im catch prüfen ob es eine Ex einer bestimmten Exklasse gab.





.
Last edited: 2018-11-16 11:04:10 +0100 (CET)

View full thread Jeder kennt Traits