【问题标题】:error in return codes used in batch (when DLL not present)批处理中使用的返回码错误(当 DLL 不存在时)
【发布时间】:2018-07-29 08:13:39
【问题描述】:

我遇到了一个奇怪的错误,我不知道是什么原因造成的 我有一个非常简单的控制台应用程序,带有 try-catch

static int Main()
{
    int returncode = 0;
    try
    {
        //some processing
    }
    catch
    {
        returncode = 1;
    }
    return returncode;
}

还有一个批处理文件

echo off
theprogram.exe
if errorlevel 1 goto Error
if errorlevel 0 goto Sucesss
echo I dont know what happened
echo %errorlevel%
goto :EOF

:Error
echo There was an error
goto :EOF

:Sucess
echo Completed Succesfully
goto :EOF

当我成功执行批处理文件时,它运行良好。 但是当我在失败的情况下执行它时,即使返回值为 1 我有时得到 255,有时得到 -532462766...

我不知道为什么...(我不习惯使用批处理文件)

编辑: 我做了更多的实验。该代码使用 DLL。如果该 DLL 不存在,则会发生上述情况。 我猜测当 DLL 不存在时,它会抛出一个异常,该异常将被 catch 捕获,因此返回代码为 1,但似乎不会发生

更奇怪的是,如果我故意抛出“DLLNotFoundException”,它会很好用

try
{
    throw new DllNotFoundException();
}
catch
{
    returncode = 1;
}

但在实际 DLL 不存在时不会

【问题讨论】:

    标签: c# batch-file dll return-value


    【解决方案1】:

    这是您的 (.bat) 代码稍作修改 (code.bat):

    @echo off
    
    call inner.bat %~1
    
    echo ERRORLEVEL: %ERRORLEVEL%
    
    if "%ERRORLEVEL%" equ "0" (
        goto :success
    )
    
    
    :error
        echo There was an error
        goto :eof
    
    :success
        echo Completed Succesfully
        goto :eof
    

    inner.bat

    if "%~1" neq "" (
        echo Inner script: exiting with %~1
        exit /b %~1
    ) else (
        echo Inner script: exiting with 0
        exit /b 0
    )
    

    注意事项

    • inner.bat - 是 theprogram.exe 的替代品:
    • code.bat
      • 使用其 1st 参数调用 inner.bat(我这样做是为了对整个事物进行参数化,因此如果需要不同的行为,只需为参数而不是修改代码)
      • 更改了检查内部进程是否以错误结束的方式:而不是if ERRORLEVEL valueif %ERRORLEVEL equ 0(尽管有些人可能会认为这是不正确的,而且在某些情况下确实会产生意想不到的结果)。更多详情,请再次访问[SS64]: %Errorlevel%
      • 这样,0 表示成功,其他所有值(正值或负值)表示错误
      • :error 标签(标签行只有,后面的 2 行也不需要)不再需要,但我把它留在那里
      • 还做了一些代码和输出格式

    输出

    E:\Work\Dev\StackOverflow\q048860316>code.bat -23456
    Inner script: exiting with -23456
    ERRORLEVEL: -23456
    There was an error
    
    E:\Work\Dev\StackOverflow\q048860316>code.bat
    Inner script: exiting with 0
    ERRORLEVEL: 0
    Completed Succesfully
    
    E:\Work\Dev\StackOverflow\q048860316>code.bat 12
    Inner script: exiting with 12
    ERRORLEVEL: 12
    There was an error
    
    E:\Work\Dev\StackOverflow\q048860316>code.bat 0
    Inner script: exiting with 0
    ERRORLEVEL: 0
    Completed Succesfully
    


    • 现在,无论C# 程序的ExitCode(错误情况下为!= 0)是什么,.bat都会正确处理它>
    • C# 中可能存在一些糟糕的错误处理,这会导致进程以错误的ExitCode 退出,但 .bat 中没有任何内容em> 在这种情况下可以做

    【讨论】:

      猜你喜欢
      • 2014-05-28
      • 2020-02-12
      • 2023-04-05
      • 2012-01-12
      • 1970-01-01
      • 1970-01-01
      • 2019-09-19
      • 1970-01-01
      相关资源
      最近更新 更多