SVN :: Error回调如何识别调用它的上下文?

时间:2010-04-14 16:47:39

标签: perl svn client

我使用Perl绑定SVN::Client等编写了一些相当广泛的Perl模块和脚本。由于SVN :: Client的调用都在模块的深处,我已经覆盖了默认的错误处理。

到目前为止,我已经通过设置

完成了这项工作
$SVN::Error::handler = undef;

as described in the docs,但是这会使单个调用变得有点混乱,因为您必须记住在列表上下文中对SVN::Client进行每次调用并测试第一个错误值。

我想切换到使用我写的错误处理程序;但是$SVN::Error::handler是全局的,所以我看不出我的回调可以确定错误来自何处,以及设置错误代码的对象。

我想知道我是否可以为此目的使用池:到目前为止,我已经忽略了池与在Perl中工作无关,但是如果我用我创建的池调用SVN::Client方法,那么{{1}} 3}}对象是在同一个池中创建的吗?

有没有人对此有任何了解或经验?

1 个答案:

答案 0 :(得分:1)

好的,我将假设问题是(a)你想在发生错误时在某个对象中设置一个标志,然后在所有操作结束时检查该标志,并且(b)您的错误处理程序(在全局变量中)需要某种方式来知道要触摸的对象。您可以使用闭包来实现此目的,如下所示:

#
# This part is the library that implements error handling a bit like
# SVN::Client
#
sub default_error_handler {
  croak "An error occurred: $_[0]";
}

our $global_error_handler = \&default_error_handler;

sub library_function_that_might_fail {
  &$global_error_handler("Guess what - it failed!");
}

#
# This part is the function that wants to detect an error
#
sub do_lots_of_stuff {
  my $error = undef; # No errors so far!

  local($global_error_handler) = sub { $error = $_[0]; };

  library_function_that_might_fail();
  library_function_that_might_fail();
  library_function_that_might_fail();

  if ($error) {
    print "There was an error: $error\n";
  }
}


#
# Main program
#
do_lots_of_stuff();

关键是当在do_lots_of_stuff()中我们将错误处理程序设置为匿名子时,该子继续访问创建它的函数的局部变量 - 因此它可以修改{{1发出错误信号。