繁体   English   中英

Objective-C异常处理:未被除以“零例外”

[英]Objective-C Exception Handling: “Divided by Zero Exception” is not getting caught

我的程序中有以下代码。

@try {

    float result =  4 / 0; // LINE 1

} @catch (NSException *e) {

    NSLog(@"Exception : %@", e);
    return 0;
}

我期望在第1行中捕获到异常,并将其抛出到@catch块。 但是执行在第1行中止,控制台中显示EXC_ARITHMETIC

我在这里做错了什么? 我必须做哪些必要的事情来进行异常处理?

EXC_ARITHMETIC是一种低级异常,称为“ 信号 ”。 捕获它们的唯一方法是注册一个信号处理程序,例如:

#include<signal.h>
void handler(int signal) {
    if (signal == FPE_FLTDIV)
        printf("Divide by 0 exception\n");
}

signal(SIGFPE, handler);    

但是,在这种处理程序中唯一安全的事情是清理所有资源并干净地退出。

除以零不是NSException。

试试看(尽管我从未尝试过):

@try {

    float result =  4 / 0; // LINE 1

} @catch (NSException *e) {

    NSLog(@"Exception : %@", e);
    return 0;
}
@catch (id ue) {

    //DIVIDE BY ZERO ATTEMPT MAY ENDUP HERE
    NSLog(@"Exception : %@", ue);
    return 0;
}

======编辑=======

事实证明,除以零不是obj-c异常。 但似乎您可以在全球范围内捕获此类异常。

如何捕获全局异常?

实际的float结果= 4/0; 永远不会引发任何信号或异常(xcode,LLVM)。 不知道为什么它只是默默地将inf返回结果。

“ 4/0”是具有已知文字的表达式,可以很容易地通过编译时来计算-因此,在该运行时不会有异常。

我正在使用LLVM 5.1编译器。 在* .m文件中,尝试过该行

float result = 4 / 0;

int result = 4 / 0;

两者都使结果为零。 但是,由于两者都包含表达式4/0(无论变量定义类型如何,该表达式都是零除以整数),因此编译器仅给出警告。 我使用过的所有其他编译器都会从该表达式给出错误。

C语言仅指定未定义整数除以零。 在这种情况下使用的编译器显然将结果定义为零。 这是一个很好的例子,说明了为什么您永远都不应依赖未定义的行为来实现预期的行为。

异常列表和被零除不是预定义的异常。 另外,要知道异常的类型,您应该将name消息发送到异常对象。

NSLog(@"Exception : %@", [ e name ] );

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM