Hi.

Montei uma classe que utiliza o role Throwable para tratar minhas
exceptions. Nestas exceções específicas, preciso escrever os dados dentro
de um CSV. Porém, como eu já esperava, não consigo manter o file handle
aberto dentro da classe para cada vez que chamo o método throw().

Escrevi um código para ilustrar o problema. Note que o file handle é apenas
um bool apenas para exemplificar:


package Exception;
use Moose;
with 'Throwable';

has errstr => (is => 'rw', isa => 'Str');
has fh     => (is => 'rw', isa => 'Int', default => 0);

sub write {
    my ($self) = @_;

    if(!$self->fh) {
        # Simulando a abertura do file handle
        print STDERR "Como se estivessemos abrindo o fh...\n";
        $self->fh(1);
    } else {
        # Escrevendo no arquivo...
        print STDERR "Como se estivessemos escrevendo no fh\n";
    }
}

1;

package main;

use common::sense;

sub any_action {
    my ($x) = @_;

    if($x < 10) {
        Exception->throw({
            errstr => 'x menor que 10',
        });
    }
}

for(0 .. 11) {
    eval {
        any_action($_);
    };
    if($@) {
        $@->write();
        printf "exception capturada: '%s'\n", $@->errstr;
    }
}

1;


Pensei em inúmeros meios, como singleton (que não funciona com o role) mas
nada muito elegante. E não quero ficar abrindo e fechando o filehandle pra
cada exception disparada, né.
Alguém tem alguma sugestão de como lidar com exceptions mantendo o file
handle aberto? Ou um novo módulo ao invés do Throwable?

Valeuz!
[]'s

-- 
====================================
Junior "fvox" Moraes
Perl Programmer
Linux Reg. #557527
junior[at]fvox[dot]com[dot]br
fb[dot]com/fvox
twitter[dot]com/fvox
====================================
=begin disclaimer
   Sao Paulo Perl Mongers: http://sao-paulo.pm.org/
 SaoPaulo-pm mailing list: [email protected]
 L<http://mail.pm.org/mailman/listinfo/saopaulo-pm>
=end disclaimer

Responder a