当前位置: 首页 > 知识库问答 >
问题:

MessageBox“异常程序终止”保持应用程序运行

金嘉言
2023-03-14

...有点。正如这个极其简单的例子所示,

我的一个应用程序很少以这种方式崩溃(到目前为止只报告过一次)。当一个不确定的异常发生时,我想像往常一样终止它。我的策略是(低级)记录问题,然后终止。应用程序是子系统的一部分,如果检测到任何问题,我想(重新)启动它。它是用C -Builder 6构建的,在Windows (XP)上运行...7,也是8)。我了解到< code>abort()很可能导致了这个错误消息。该应用程序有一个GUI,这就是为什么会显示一个消息框,而不仅仅是向< code>stderr输出(解除阻塞)。

只要用户不接受消息框,我的应用程序就会继续运行,例如它处理计时器(上面示例中的生命周期增加)或进程间消息,完全不知道问题。

在阅读了一些答案之后,使C程序崩溃的最简单方法是什么?和 raise(SIGABRT) 和 abort() 方法之间的区别,我尝试了以下方法

void mySignalHandler(int sig)
{
    // low-level error reporting here
    exit(-1);
}

void __fastcall TForm1::FormCreate(TObject *Sender)
{
    signal(SIGABRT, mySignalHandler);
    // some more initialisation here
}

如果调用了< code>abort()或< code>raise(SIGABRT),也可以让我的应用程序正确终止。(我也希望阻止Windows“寻找问题的解决方案”。)

从你的角度来看,这(为abort注册一个信号处理程序并在那里调用exit)可靠吗?...或者至少是可以建立的东西?

共有3个答案

秋阳旭
2023-03-14

如果你想捕捉任何程序的出口,你应该看看一个exit()。如果您想捕获所有终止事件,那么查看std::set_terminate(),如果您想捕获所有意外异常,那么查看std::set_unexpected()。如果只想捕获< code>abort(),可以用< code>SIGABRT信号值调用signal()。您还可以用< code>try{your code}catch(...){自定义事件处理程序}。

姜鹏程
2023-03-14

当未处理的异常导致终止时,您可能能够使用 Windows 错误报告创建进程的转储。然后,您可以在闲暇时查看转储,并允许某些父进程或其他监视器重新启动进程。如果选择此策略,则不会尝试处理代码中的故障,而是允许它。

经博延
2023-03-14

在C Builder安装文件夹中,检查以下文件:

  • source\cpprtl\Source\misc\errormsg.c - _ErrorMessage的实现
  • source\cpprtl\Source\procses\abort.c - abort 的实现,它调用_ErrorMessage
  • source\cpprtl\Source\misc\assert.c - _assert的实现,它调用_ErrorMessage

errormsg。c定义了一个未记录的_messagefunc函数指针,您可以将其设置为覆盖默认行为。虽然它没有文档记录,也没有在任何头文件中声明,但您可以将其声明为<code>extern</code>并以这种方式访问它。示例用法:

extern int (_RTLENTRY * _EXPDATA _messagefunc)(char *msg);

static int LogAndDie(char *msg)
{
  LogMessageToSomeFile(msg);
  exit(1);
  return 0;
}

void InitializeErrorHandling()
{
  _messagefunc = LogAndDie;
}
 类似资料:
  • 我有一个简单的Spring云kafka流应用程序。每次有异常时,应用程序都会终止,我无法覆盖此行为。当有某些类型的异常时,所需的结果是增量退回,或者继续其他类型的异常。我使用和 application.yaml 豆子 事件处理器 继续错误处理程序

  • 运行应用程序时的问题:在Consol屏幕中 java.lang.SecurityException:权限拒绝:starting Intent{act=Android.Intent.action.main cat=[Android.Intent.category.launcher]flg=0x10000000 cmp=com.test.sample/.setting}from null(PID=91

  • 问题内容: 我找到了终止(关闭或停止)Java程序的方法。我找到了两个解决方案。 使用 return; 当我想退出或终止程序执行时,添加它。 使用 System.exit() ; 有时我用它。我从This Question中了解了 Sytem.exit()。 所以,我对他们都了解一点。但是我仍然对它们的实际工作方式感到困惑。请检查以下代码… 我确定 2不会出现。我想知道为什么或其他代码可以在的语句

  • 我有一个正在运行的Spark应用程序,它占据了所有核心,而我的其他应用程序将不会被分配任何资源。 我做了一些快速的研究,人们建议使用YARN kill或 /bin/spark-class来杀死命令。然而,我使用的是CDH版本, /bin/spark-class根本不存在,YARN kill应用程序也不起作用。 有人能和我一起吗?

  • 问题内容: 我试图确保脚本仍在开发服务器上运行。它整理统计数据并提供Web服务,因此应该可以持续使用,但是一天几次,它会由于未知原因而死掉。当我们注意到我们只是再次启动它时,但是后部很痛苦,有些用户没有权限(或专有技术)来启动它。 我内的程序员想花几个小时来解决问题的根源,但内心的忙碌的人认为必须有一种简便的方法来检测应用程序是否未运行,然后重新启动它。 我知道我 可以 通过grep cron-s

  • 我在我的Android应用程序中面临奇怪的问题。它总是给我错误的名字 JAVAlang.RuntimeException:无法实例化应用程序io。日本动画。应用程序。应用程序:java。lang.ClassNotFoundException:在路径:DexPathList[[zip文件”//data/app/io.hitanime.app-957U27HR57arXVvYGSCFSQ==/base