Как использовать исключения Perl? - PullRequest
2 голосов
/ 20 апреля 2011

У меня есть проблема Perl следующего вида:

$object1 = $ABC->Find('test1');

Затем я хочу вызвать подпрограмму с именем CheckResult in Report.pm:

$Report->CheckResult($object, "Finding the value");

В другом случаеЯ хочу сообщить, была ли выполнена конкретная команда, поэтому я делаю что-то вроде этого:

$Report->CheckResult($ABC->Command(100,100), "Performing the command");

Теперь в Report.pm:

sub CheckResult {
    my ($result, $information) = @_;
    # Now, I need something like this
    if ($result->isa('MyException')) {
        # Some code to create the report
    }
}

Как использовать класс исключений и какпроверить, возникло ли исключение и, если это необходимо, выполнить задачу, необходимую?


Редактировать:

На данный момент у меня есть модуль такого типа:

package MyExceptions;

use strict;
use warnings;

use Exception::Class (
    'MyExceptions',
    'MyExceptions::RegionNotFound'     => {isa => 'MyExceptions'},
    'MyExceptions::CommandNotExecuted' => {isa => 'MyExceptions'}
);

Другой модуль:

package ReportGenerator;

use strict;
use warnings;

sub CheckResult {
    my ($result, $info) = @_;

    # Here is want to check of $result and throw an exception of the kind
    # MyExceptions::RegionNotFound->throw(error => 'bad number');
    # I'm not sure how to do this
}
1;

Пользователь, в свою очередь, написал бы что-то вроде этого:

$Report->CheckResult($ABC->Command(100,100), "Tapping Home");

Может ли кто-нибудь помочь?Извините за мое невежество, я вообще не делал исключений.

Ответы [ 2 ]

3 голосов
/ 20 апреля 2011

Бесполезно, если вы генерируете исключение, и пользователь запускает код, который его не перехватывает.Код для Exception::Class довольно прост:

# try
eval { MyException->throw( error => 'I feel funny.' ) };

# catch
if ( $e = Exception::Class->caught('MyException') ) {
    ...

Таким образом, он показывает и код метания, и код клиента.Строка eval является синтаксисом try и throw.Остальное ловит.Так что в некотором роде высокого уровня регургитации ваших спецификаций это будет выглядеть примерно так:

if ( !Object->find_region( $result )) { # for OO goodness
    MyExceptions::RegionNotFound->throw( error => 'bad number' );
}

Ваш клиентский код будет просто тестировать - я рекомендую на самом деле тестировать (и заморозить ) $@ первый.

eval { 
    $Report->CheckResult($ABC->Command(100,100), "Tapping Home");
};
if ( my $ex = $@ ) { # always freeze $@ on first check
    my $e;
    if ( $e = Exception::Class->caught('MyExceptions::RegionNotFound')) { 
        warn( $e->error, "\n", $e->trace->as_string, "\n" );
    }
}
0 голосов
/ 20 апреля 2011

в Report.pm:

sub CheckResult {
    try {
        $Report->CheckResult($object,”Finding the value”);
    } catch MyException with {
       # Exception handling code here
    };
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...