我尝试在非常旧的 MacOS 版本中打开 Minecraft。每次打开时都会显示“Minecraft Launcher 意外退出”,并在底部显示一条自定义消息。
Exception Type: SIGABRT
Exception Code: 0x000000000000 0x000000000000
Exception Note: EXC_CORPSE_NOTIFY
Application Specific Information:
abort() called
Minecraft requires at least MacOS 10.9, and trying to run on 10.8.5
我怎样才能在我的代码中做同样的事情?如果我致电
abort()
,如何指定在
应用程序意外退出窗口中的应用程序特定信息下显示的原因?
abort()
函数调用指定任何消息。请参阅 ANSIC 标准定义和函数 abort 的说明。然后你就会得到答案。
在
stdout
stderr
或 abort()
。#include <stdlib.h>
void abort(void);
abort
函数会导致
程序异常终止发生,除非信号SIGABRT
被捕获并且信号 处理程序不返回。 是否打开带有未写缓冲的流 数据被刷新,打开的流被关闭,或者临时文件被关闭 删除是实现定义的。 实现定义的 终止失败状态的形式返回给 主机环境通过函数调用 raise(SIGABRT) 来实现。 abort 函数不会返回到其调用者
打印到标准错误或在中止调用之前使用断言语句将是实现此功能的好方法。
abort()
调用和消息“Minecraft 至少需要 MacOS 10.9,并尝试在 10.8.5 上运行”可能已由 macOS 本身处理,而不是Minecraft 启动器。
但是,如果您愿意编写非盈利代码,可以通过多种方式获取自定义消息。最简单的方法是使用 Objective-C 来@throw
或
raise
带有自定义消息的异常。异常将得不到处理并导致程序崩溃,类似于 abort()
。[NSException raise:NSInternalInconsistencyException
format:@"The program encountered a fatal error and could not continue."];
__builtin_unreachable();
您可以通过纯 C 直接调用 Objective-C 运行时函数来完成此操作。
#import <CoreFoundation/CoreFoundation.h>
#import <objc/objc-runtime.h>
void (*objc_exceptionMessageSend)(Class,SEL,CFStringRef,CFStringRef,...) =
(void(*)(Class,SEL,CFStringRef,CFStringRef,...))(objc_msgSend);
objc_exceptionMessageSend(objc_getClass("NSException"),
sel_getUid("raise:format:"),
CFSTR("NSInternalInconsistencyException"),
CFSTR("The program encountered a fatal error and could not continue."));
__builtin_unreachable();
另一种方法似乎是抛出 MACH 异常,至少根据描述macOS 如何生成崩溃报告