Обработка исключений в Objective-C: «Разделено на ноль исключений» не попадает в ловушку - PullRequest
2 голосов
/ 10 февраля 2011

В моей программе есть следующий код:

@try {

    float result =  4 / 0; // LINE 1

} @catch (NSException *e) {

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

Я ожидал, что исключение будет перехвачено в строке 1 и брошено в блок @catch.Но выполнение прерывается на LINE 1 , показывая EXC_ARITHMETIC в консоли.

Что я здесь не так делаю?Какие необходимые вещи я должен сделать для обработки исключений?

Ответы [ 6 ]

4 голосов
/ 10 февраля 2011

EXC_ARITHMETIC - это тип исключения низкого уровня, известного как " signal ".Единственный способ поймать их - это зарегистрировать обработчик сигнала, например:

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

signal(SIGFPE, handler);    

Однако единственная безопасная вещь, которую можно сделать в таком обработчике, - это очистить все ресурсы и завершить работу.

1 голос
/ 10 февраля 2011

Деление на ноль - не исключение NSE.

Дайте попробовать (хотя я никогда не пробовал):

@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. Но, кажется, вы можете поймать такие исключения во всем мире.

Как перехватить глобальные исключения?

0 голосов
/ 11 апреля 2014

Я использую компилятор LLVM 5.1. В файле * .m только что попробовал строку

float result = 4 / 0;

и

int result = 4 / 0;

и оба дают результат равным нулю. Но, поскольку оба содержат выражение 4/0, которое является целочисленным делением на ноль независимо от типа определения переменной, компилятор только выдает предупреждение. Все остальные используемые мной компиляторы выдали бы ошибку из этого выражения.

Язык C определяет только то, что целочисленное деление на ноль не определено. Компиляторы, используемые в этом случае, по-видимому, определяют результат равным нулю. Это хороший пример того, почему вы никогда не должны зависеть от неопределенного поведения, которое ведет себя так, как вы ожидаете.

0 голосов
/ 13 февраля 2014

«4/0» - это выражение с известными литералами, которое может быть очень легко вычислено во время компиляции - поэтому не будет исключений времени выполнения для этого ...

0 голосов
/ 05 октября 2012

Фактически результат с плавающей запятой = 4/0; никогда не вызовет какой-либо сигнал или исключение (xcode, LLVM). Понятия не имею, почему он просто тихо возвращает inf в результат.

0 голосов
/ 10 февраля 2011

Список исключений и деление на ноль не является предопределенным исключением.Также, чтобы узнать тип исключения, вы должны отправить name сообщение объекту исключения.

NSLog(@"Exception : %@", [ e name ] );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...