代码之家  ›  专栏  ›  技术社区  ›  heferav

我是否需要在调用win32::ole->lasterror时捕获错误?

  •  2
  • heferav  · 技术社区  · 15 年前

    [编辑] -事后看来,这个问题是错误的。我没有删除它,因为它是 不正确使用Eval 纠正批评 Perl:评论家 .

    Perl批评家对下面的代码提出了以下批评:

    未测试eval的返回值。你不能依赖 $@/$EVAL_ERROR 判断评估是否失败

    my $Jet = Win32::OLE->CreateObject('DAO.DBEngine.36')
        or croak "Can't create Jet database engine.";
    my $DB = $Jet->OpenDatabase($DBFile)
    
    # code omitted for the sake of brevity
    # perl script writes results to Access db via an append query
    $DB->Execute( $SQLquery, 128 );                       #128=DBFailOnError
    
    eval {$err = Win32::OLE->LastError()} ; #<<<< PROBLEM LINE SEE FEEDBACK BELOW  
    if ( $err){
         print $ERROR "WIN32::OLE raised an exception: $err\n";
         Win32::OLE->LastError(0);  # this clears your error
    }
    

    我的想法是我正在使用 eval 检测错误对象的存在以及 Win32:OLE 用于检测错误并报告错误的模块。

    我可以忽略这些批评吗?

    2 回复  |  直到 15 年前
        1
  •  3
  •   Sinan Ünür    15 年前

    离开 perl-critic 问题是,您的代码没有多大意义。

    这个 Win32::OLE docs 解释何时抛出异常(以及如何自动捕获异常)。

    LastError 只需在发生错误后向您提供有关错误的信息,假设您的程序没有停止。把它包起来 eval 毫无意义。

    更新: 我会按照以下几行写一些东西(因为我现在在Linux上,无法访问Windows,所以没有经过测试):

    use strict;
    use warnings;
    
    use Carp;
    
    use Win32;
    use Win32::OLE;
    
    $Win32::OLE::Warn = 3;
    
    # No need for this eval if you are OK with the default error message    
    my $Jet = eval {
        Win32::OLE->CreateObject('DAO.DBEngine.36')
    } or croak sprintf(
        "Can't create Jet database engine: %s", 
        win32_error_message(Win32::OLE->LastError)
    );
    
    # No need for this eval if you are OK with the default error message
    my $DB = eval {
        $Jet->OpenDatabase($DBFile)
    } or croak sprintf(
        "Can't open database '$DBFile': %s",
        win32_error_message(Win32::OLE->LastError)
    );
    
    my $result = eval {
        $DB->Execute( $SQLquery, 128 )
    };
    
    unless (defined $result) {
        print $ERROR win32_error_message(Win32::OLE->LastError);
        Win32::OLE->LastError(0);
    }
    
        2
  •  2
  •   innaM    15 年前

    该消息的含义在 documentation . 简而言之,它告诉你不要依赖 $@ 独自一人之后 eval ,但也要检查 埃瓦 .

    但是,在您的情况下,问题是您没有检查 埃瓦 你也不检查 $@ 而且,你的使用 埃瓦 是完全多余的,因为您调用的方法不应该抛出任何异常。