代码之家  ›  专栏  ›  技术社区  ›  Colin Fine

SVN::错误回调如何识别从中调用它的上下文?

  •  3
  • Colin Fine  · 技术社区  · 15 年前

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

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

    $SVN::Error::handler = undef;
    

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

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

    我想知道是否可以使用一个池来实现这个目的:到目前为止,我忽略了与在Perl中工作无关的池,但是如果我调用 客户机 我创建的池的方法 SVN::Error 对象是否在同一个池中创建?

    有没有人知道或有过与此相关的经验?

    1 回复  |  直到 15 年前
        1
  •  1
  •   psmears Touffy    15 年前

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