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

Perl SVN::Error回调如何识别调用它的上下文?,perl,svn,client,Perl,Svn,Client,我已经使用Perl绑定等编写了一些相当广泛的Perl模块和脚本。由于对SVN::Client的调用都深入到模块中,因此我已经覆盖了默认的错误处理 到目前为止,我通过设置 $SVN::Error::handler = undef; ,但这会使单个调用有点混乱,因为您必须记住在列表上下文中对SVN::Client进行每个调用,并测试第一个值是否有错误 我想切换到使用我将编写的错误处理程序;但是,$SVN::Error::handler是全局的,所以我看不到回调可以确定错误来自何处,以及设置错误代码

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

到目前为止,我通过设置

$SVN::Error::handler = undef;
,但这会使单个调用有点混乱,因为您必须记住在列表上下文中对
SVN::Client
进行每个调用,并测试第一个值是否有错误

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

我想知道是否可以使用池来实现此目的:到目前为止,我忽略了与使用Perl无关的池,但是如果我使用我创建的池调用
SVN::Client
方法,是否会在同一个池中创建任何对象


有人对此有任何知识或经验吗?

好的,我假设问题是(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\u lots\u of \u stuff()
中,我们将错误处理程序设置为匿名子对象,sub继续访问创建它的函数的局部变量-因此它可以修改
$error
,以发出发生错误的信号。

您可以看看SVK,它完全是用Perl编写的,带有SVN绑定…您可以在其中找到一些示例。。。顺便说一句:与SVN 1.4.6的关系有点过时了…另一个问题正在我脑海中浮现。用Perl实现绑定的目的是什么?为什么不解析SVN命令行客户端的输出呢?我实际上没有使用Alien SVN,我使用的是SVN 1.6附带的绑定:在Alien SVN中查找perldoc更容易。至于为什么要使用API:我们为什么要使用API?API函数的返回是定义的:来自命令行工具的消息通常不是定义的。@Colin为什么不定义它们?它们当然是…或者在哪些情况下不是?为什么要麻烦确切地指定命令行工具在特定情况下输出的消息,并在发布新版本时绑定到这些消息?这是毫无意义的。API的全部目的是为一些工具提供一个定义的接口-如果有其他选择,调用命令行是愚蠢的。谢谢。我很久以前问过这个问题,现在有点不对劲了;但是当我回到这个项目的时候,我会考虑这个建议。听起来正是我想要的。