如何在程序执行时忽略windows错误提示?
我有一个在Windows cmd上运行的程序,当程序抛出错误时,它会一直等待用户输入忽略/继续或取消,但我有一个批处理文件,它会在出现错误时自动重新启动程序,但由于它一直在等待用户输入,我不得不去那里按一个按钮如何在程序执行时忽略windows错误提示?,windows,batch-file,cmd,ignore,Windows,Batch File,Cmd,Ignore,我有一个在Windows cmd上运行的程序,当程序抛出错误时,它会一直等待用户输入忽略/继续或取消,但我有一个批处理文件,它会在出现错误时自动重新启动程序,但由于它一直在等待用户输入,我不得不去那里按一个按钮 :unturned echo (%time%) Unturned started. cd masterserver cd VisualStudio cd Debug masterserver.exe @echo All done! @echo Masterserver list
:unturned
echo (%time%) Unturned started.
cd masterserver
cd VisualStudio
cd Debug
masterserver.exe
@echo All done!
@echo Masterserver listening on port: 23466
echo (%time%) WARNING: Unturned closed or crashed, restarting. >>c:\crashlog.txt
ping 1.1.1.1 -n 1 -w 10000 >nul
goto unturned
如何使其忽略错误并自动继续
以下是提示的图像:
当在
masterserver.exe
中发生断言失败时,将显示弹出消息。失败表明存在代码错误,因为它正在编译时测试一个在运行时应该始终为true的条件,但该条件实际上为false
在本例中,错误发生在第528行的CCRakNetUDT.cpp
中的CCRakNetUDT::OnAck()。该行正在调用RakAssert(rtt<10000000)
,其中rtt
是OnAck()
的输入参数。断言是rtt
的值应该始终小于10000000
,但实际上不是
void CCRakNetUDT::OnAck(CCTimeType curTime, CCTimeType rtt, bool hasBAndAS, BytesPerMicrosecond _B, BytesPerMicrosecond _AS, double totalUserDataBytesAcked, bool isContinuousSend, DatagramSequenceNumberType sequenceNumber )
{
#if CC_TIME_TYPE_BYTES==4
RakAssert(rtt < 10000);
#else
RakAssert(rtt < 10000000); // <-- line 528
#endif
RakNetDefines.h
#ifndef RakAssert
#if defined(_XBOX) || defined(X360)
#else
#if defined(_DEBUG)
#define RakAssert(x) assert(x);
#else
#define RakAssert(x)
#endif
#endif
#endif
根据:
计算表达式,当结果为false时,打印诊断消息并中止程序
assert宏通常用于在程序开发过程中识别逻辑错误。当出现意外情况时,使用它停止程序执行,方法是仅当程序运行不正确时,将表达式参数的值实现为false通过定义宏NDEBUG
,可以在编译时关闭断言检查。通过使用/DNDEBUG
命令行选项,可以在不修改源文件的情况下关闭assert宏。在包含
之前,可以使用#define NDEBUG
指令关闭源代码中的assert宏
当表达式计算结果为false(0)时,assert宏将打印一条诊断消息,并调用abort
终止程序执行。如果表达式为真(非零),则不执行任何操作。诊断消息包括失败的表达式、源文件的名称以及断言失败的行号
诊断消息的目的地取决于调用例程的应用程序类型。控制台应用程序始终通过stderr
接收消息在基于Windows的应用程序中,assert
调用WindowsMessageBox
函数来创建一个消息框,以显示消息以及OK
按钮。当用户单击确定
时,程序立即中止
当应用程序链接到运行时库的调试版本时,assert
创建一个带有三个按钮的消息框:Abort
、Retry
和Ignore
。如果用户单击“中止”
,程序将立即中止。如果用户单击“重试”,将调用调试器,并且如果启用了实时(JIT)调试,则用户可以调试程序。如果用户单击Ignore
,assert
继续正常执行:使用OK
按钮创建消息框。请注意,当存在错误条件时,单击“忽略”,可能会导致未定义的行为
未定义NDEBUG
时,在C运行时库的发行版和调试版中都会启用assert
宏定义NDEBUG
时,宏可用,但不计算其参数,且不起作用。启用时,assert
宏调用\u wassert
以实现它。其他断言宏,\u ASSERT
、\u ASSERTE
和\u ASSERT\u EXPR
,也可以使用,但它们仅在定义了\u DEBUG
宏并且在与C运行时库的调试版本链接的代码中时,才计算传递给它们的表达式
因此,如果要禁用此特定弹出错误,您需要:
masterserver.exe
以供发布,而不是调试,因此RakAssert()
是不可操作的
/D
开关定义NDEBUG
,因此assert()
是禁止的
只需知道,如果错误再次发生,禁用断言将有应用程序崩溃或行为不正确的风险。如果有人出现此问题,则更新:
正如Remy所说,我在发布模式下编译了它,问题完全解决了,应用程序现在运行正常,没有任何错误。由于脚本本身没有此类提示,因此必须由masterserver自己在退出之前进行提示。它有命令行参数来禁用提示吗?我从这里下载它并用visual studio编译,然后我用这个批启动exe,不知道命令行参数哇,谢谢。我已经在unity论坛上发布了,但正如我所看到的,代码来自raknet本身,而不是unity,raknet fórum似乎被禁用。由于修复代码不是一个选项,我想我需要暂时忍受错误,我正在尝试/d命令行,看看会发生什么。
#ifndef RakAssert
#if defined(_XBOX) || defined(X360)
#else
#if defined(_DEBUG)
#define RakAssert(x) assert(x);
#else
#define RakAssert(x)
#endif
#endif
#endif