Как правильно обрабатывать ошибки на iPhone - PullRequest
5 голосов
/ 10 мая 2011

У меня есть вопрос об обработке ошибок / исключений на iPhone.

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

это означает, что вы не можете использовать их как в java?

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

Вопрос, поставленный просто: могу ли я следовать примеру, который у меня есть на Java, и "переведите "это в Objective-C (и используйте исключения Objective-C) или есть лучший способ сделать это?

вот код, который я хотел бы сделать дружественным для объектива-c:

public void addPerformance(Perfomance perf) {
        //do some preparation
            ...
    //execute the usecase
        executor(new AddPerformance(perf));
}

    private void executor(Usecase usecase) {

            try {
                UnitOfWorkServices.INSTANCE.bizTransactionStart();
                usecase.execute();
UnitOfWorkServices.INSTANCE.bizTransactionCommit();
            } catch (RealException re) {
                UnitOfWorkServices.INSTANCE.bizTransactionEscape();
                throw re;
            } catch (Exception e) {
                UnitOfWorkServices.INSTANCE.bizTransactionEscape();
                throw new FatalException(this.getClass().getName() + " / executor("
                        + usecase.getClass().getSimpleName() + ")", e,
                        "APPXCP_006_UNEXPECTED_EXCEPTION",
                        "\n\t |*| : Unexpected exception translated into FatalException");
            } finally {
                UnitOfWorkServices.INSTANCE.bizTransactionEnd();
            }
        }

Все исключения предназначены для того, чтобы пользовательский интерфейс отображал сообщение об ошибке.

спасибо за помощь, Майкл

Ответы [ 2 ]

3 голосов
/ 10 мая 2011

В общем, да, вы можете перевести свою логику try / catch в сопоставимую конструкцию в Objective-C и получить сопоставимые результаты. Хотя будьте осторожны с этой строкой throw re;, так как неперехваченное исключение на iPhone приведет к сбою вашего приложения.

Более конкретно, однако, стандартный шаблон, используемый iPhone SDK и другими часто используемыми библиотеками, состоит в том, что вместо генерирования исключений методы API, которые могут не работать по разным причинам, возвращают логическое значение, указывающее, выполнялась ли операция. успешно, и принять в качестве параметра ссылку на указатель NSError, который используется в случае ошибки, чтобы предоставить вызывающей стороне конкретные сведения о том, что пошло не так. Так что в этом случае ваш код может перевести что-то вроде:

NSError* error = nil;
[[UnitOfWorkServices sharedInstance] bizTransactionStart];
bool success = [usecase execute:&error];
if (success) {
    [[UnitOfWorkServices sharedInstance] bizTransactionCommit];
}
else if (error) {
    int code = [error code];
    [[UnitOfWorkServices sharedInstance] bizTransactionEscape];
    if (code == MY_MINOR_ERROR_CODE) {
        //do something
    }
    else if (code == MY_FATAL_ERROR_CODE) {
        //do something else
    }
    else {
        //handle unexpected error type(s)
    }
}
else {
    //operation failed with no specific error details
    [[UnitOfWorkServices sharedInstance] bizTransactionEscape];
    //handle generic error
}
[[UnitOfWorkServices sharedInstance] bizTransactionEnd];
1 голос
/ 10 мая 2011

Вы можете использовать исключения так же, как и исключения в Java, но это не рекомендуемый способ сделать это. Таким образом, перевод Java в Objective-C работает, и большинство людей поймут ваши намерения. Но результат будет таким же плохим, как если бы вы пытались перевести английский на немецкий, используя словарь; написание идеально, но грамматика и контекст совершенно неверны.

Понимание «способа какао» для обработки ошибок и исключений поможет вам создать более надежные приложения для iOS и лучше понять, как использовать официальный и сторонний API: s.

Я написал более длинную запись в блоге на эту тему здесь: http://blog.jayway.com/2010/10/13/exceptions-and-errors-on-ios/

Давайте вспомним важные части:

Исключения следует использовать только для ошибок программирования и фатальных вещей, которые вы не можете исправить. Например, исключение за пределами допустимого диапазона: если вы в первый раз вызвали неверный аргумент, если ваше приложение содержит ошибку, повторная попытка 100 раз не исправит ваше приложение, а только продолжит давать сбой. Исключениями являются исключения для обычного рабочего процесса, которые помогут вам исправить все ошибки до доставки приложения конечным пользователям.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...