我有一段Perl代码,有点像下面这样(强烈简化):有一些级别的嵌套子程序调用(实际上是方法),而一些内部代码执行自己的异常处理:
sub outer { middle() }
sub middle {
eval { inner() };
if ( my $x = $@ ) { # caught exception
if (ref $x eq 'ARRAY') {
print "we can handle this ...";
}
else {
die $x; # rethrow
}
}
}
sub inner { die "OH NOES!" }
Run Code Online (Sandbox Code Playgroud)
现在我想更改该代码,以便它执行以下操作:
为每个"冒泡"到最外层(sub outer)的异常打印一个完整的堆栈跟踪.具体来说,堆栈跟踪应该不是在"第一层次停止eval { }".
无需更改任何内部级别的实现.
现在,我这样做的方法是__DIE__在outersub中安装一个本地化的处理程序:
use Devel::StackTrace;
sub outer {
local $SIG{__DIE__} = sub { …Run Code Online (Sandbox Code Playgroud) 有没有办法在当前的Gevent过程中查询greenlet的数量,以及它们的状态?
例如,我想用仲裁greenlets抓取任意网站,然后我运行另一个greenlet来查询有多少正在运行的是完成/异常的数量.
或者我应该将全局变量设置为计数器?Gevent有内置的东西吗?