网络连接不良的错误处理

时间:2013-11-22 16:44:23

标签: perl mechanize

我正在使用WWW:Mechanize来连接和导航网站,但有时我的网络连接超时并且整个应用程序崩溃了。我一直在研究各种选择,但不知道如何继续。我不仅希望阻止应用程序崩溃,而且还需要构建一些逻辑来解决问题,或者标记项目以便稍后再尝试。

总的来说,我有一个相当大的功能,遍历网站结构,填写几个字段,然后上传文件。如果网络出现故障,则可能在任何时间点出现问题。

目标:会出现网络故障......所以我需要构建错误处理来处理它。如果在执行任何方法时出现超时问题,我希望它以递增延迟重试该操作三次。如果它仍然失败,我希望它从另一个重置NIC的perl模块运行函数并进行一些网络测试。

所以这就是我在想的...... 选项1:关闭自动检查,然后每次调用机械方法时进行手动验证。这将导致大量代码复制和粘贴,如果可能的话我想避免使用此选项。

选项2:在整个代码中运行eval块中的所有语句,然后在每个语句之后检查状态。

选项3:拥有一个接受mech对象和我想要执行的动作的函数。这将在一个地方执行所有错误处理并返回更新的机械对象,以便应用程序的其余部分继续。例如,而不是执行 $ mech->获得( 'thesite');

我会做像

这样的事情
crash();

sub crash {
my $mech = WWW::Mechanize->new(agent => 'Mozilla/5.0 (compatible; MSIE 10.0;     Windows NT 6.2; WOW64; Trident/6.0)', autocheck => '0', timeout=>'200' );
$mech->ssl_opts( verify_hostname => 0);
    my $url = 'https://imaginarynonexist23123123entname.com';
    $mech = &mech_go($mech,"->get($url)");
}

sub mech_go {
my $mech = shift;
my $arg = shift;
my $run ='$mech'.$arg;
eval ( '$run' );
print Dumper ($mech);
}

我无法让它运行, - > get方法永远不会运行。你们能帮忙吗?有没有更好的方法来处理这个?

2 个答案:

答案 0 :(得分:0)

那应该是eval($run)


使用

mech_go($mech, get => $url);

sub mech_go {
   my $mech = shift;
   my $method = shift;
   for (1..2) {
      my $rv;
      if (eval {
         $rv = $mech->$method(@_)
         1  # No exception
      }) {
         return $rv;
      }
   }

   return $mech->$method(@_);
}

答案 1 :(得分:0)

如果有其他人需要,只想发布最终代码。

sub mech_go {
   my $mech = shift;
   my $method = shift;

   my $status;
   my $count = 0;
   $mech->{'status'} = 0;
   until ( $mech->{'status'} == 200 || $count == 6 ) {
    print "Count: $count \t $mech->$method(@_)\n";
    eval { $mech->$method(@_) };
    $count++;
    sleep 2;

   if ($mech->{'status'} == 200) {
    return $mech;
   }

   if ($count == 4) {
          vpn->stop_vpn(); #custom module
          print "Looks like VPN crapped out, restarting, waiting for 120 seconds\n";
          sleep 120;
          vpn->start_vpn_main();  #custom module
     } 
  }

if ($count == 5) {
   return 0; #I ran into problems here, so had to adjust this to $mech and do validation on the calling function
   }

return 0;
}