gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 04:16:20 25 4
gpt4 key购买 nike

我使用 Perl 绑定(bind) SVN::Client 编写了一些相当广泛的 Perl 模块和脚本。等等,因为对 SVN::Client 的调用都在一个模块的深处,所以我已经覆盖了默认的错误处理。

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

$SVN::Error::handler = undef;

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

我想改用我要编写的错误处理程序;但是 $SVN::Error::handler是全局的,所以我看不到我的回调可以确定错误来自何处以及在哪个对象中设置错误代码的任何方式。

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

有没有人有任何与此有关的知识或经验?

最佳答案

好的,我将假设问题是(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() ,我们将错误处理程序设置为匿名子,该子继续可以访问创建它的函数的局部变量-因此它可以修改 $error表示发生了错误。

关于perl - SVN::Error 回调如何识别调用它的上下文?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2639294/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com