小编tre*_*els的帖子

Perl:$ SIG {__ DIE__},eval {}和堆栈跟踪

我有一段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)

perl eval stack-trace

12
推荐指数
2
解决办法
8650
查看次数

获取Gevent中运行greenlet的总数?

有没有办法在当前的Gevent过程中查询greenlet的数量,以及它们的状态?

例如,我想用仲裁greenlets抓取任意网站,然后我运行另一个greenlet来查询有多少正在运行的是完成/异常的数量.

或者我应该将全局变量设置为计数器?Gevent有内置的东西吗?

python gevent

5
推荐指数
1
解决办法
2370
查看次数

标签 统计

eval ×1

gevent ×1

perl ×1

python ×1

stack-trace ×1