【问题标题】:How to catch connection errors when using Mail::SpamAssassin::Client使用 Mail::SpamAssassin::Client 时如何捕获连接错误
【发布时间】:2021-06-24 14:34:47
【问题描述】:

我在 Perl 中创建对象时遇到了错误。我当前的代码部分是这样的:

#!/usr/bin/perl
use Mail::SpamAssassin::Client;
use warnings;
use strict;

my $client = new Mail::SpamAssassin::Client({port => 783, host => 'localhost'});
my $message = '';

if(!$result) {
    print "Cant process a message ! Error: " . $result;
}

因此,如果对象已正确创建,我无法检查 $client 变量。 只有我在调用 $client->process($message) 方法后只能检查 $result 变量 但这对我来说并不令人满意。 例如,如果 spammassassin 守护进程将离线,那么我在终端中进行了通信:

创建与 spamd 守护进程的连接失败:连接被拒绝

也许我可以在调用静态方法后捕捉到这个错误消息或错误代码?

【问题讨论】:

    标签: perl object spamassassin


    【解决方案1】:

    模块会这样做:

    unless ($remote) {
      print "Failed to create connection to spamd daemon: $!\n";
      return;
    }
    

    ug。模块不应该这样做。更糟糕的是,它写入 STDOUT 而不是 STDERR!

    ...实际上,它写入默认文件句柄,通常 STDOUT,但这可以使用select 更改。这为我们提供了一个解决方案。

    use Scope::Guard qw( guard );
    
    sub validate {
       my ($client) = @_;
       open(my $fh, ">", $^O eq 'Win32' ? 'nul' : '/dev/null')
          or die $!;
    
       my $old_fh = select($fh);
       my $guard = guard { select($old_fh); };
       return $client->ping();
    }
    
    my $rv = eval { validate($client) };
    die($@) if $@;
    die($!) if !$rv;
    

    执行 ping 请求并返回并检查响应。如果你想检查创建连接而不是别的,你可以使用

    use Scope::Guard qw( guard );
    
    sub validate {
       my ($client) = @_;
       open(my $fh, ">", $^O eq 'Win32' ? 'nul' : '/dev/null')
          or die $!;
    
       my $old_fh = select($fh);
       my $guard = guard { select($old_fh); };
       return !!$client->_create_connection();
    }
    
    validate($client)
       or die($!);
    

    请注意,该模块会为每个方法调用创建一个新连接,因此检查可能会通过,但稍后的调用可能会失败(例如,由于网络问题)。

    【讨论】:

      猜你喜欢
      • 2016-01-06
      • 1970-01-01
      • 2011-01-20
      • 1970-01-01
      • 2015-12-02
      • 2016-01-29
      • 1970-01-01
      • 1970-01-01
      • 2011-09-14
      相关资源
      最近更新 更多