我正在使用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方法永远不会运行。你们能帮忙吗?有没有更好的方法来处理这个?
答案 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;
}