У Swift нет механизма, чтобы поймать все произвольные исключения во время выполнения. Причины объясняются в
на быстрых пользователей списка рассылки. Выдержка:
Swift сделал сознательный выбор, чтобы не включать исключения, через произвольных кадров стека не потому, что это было технически невозможно, но потому, что его создатели судить затраты слишком высоки.
Проблема заключается в следующем: если часть кода собирается выйти из-за ошибки , ее необходимо записать, чтобы обработать этот ранний выход. В противном случае будет ошибочно работать, не удалять память, не удается закрыть файл дескрипторы/сокеты/соединения с базой данных/что угодно, не удается освободить блокировки, и т. Д. На языке, таком как Java, для написания действительно безопасного кода требуется нелепое количество блоков try/finally. Вот почему никто этого не делает. Они выносят суждения о том, какие исключения у них есть , и какие ресурсы опасны для утечки, и только защищают свой код от этих конкретных ожидаемых условий. Затем происходит что-то непредвиденное, и их программа ломается.
Это еще хуже, в опорном подсчетом языке, как Swift, потому что правильно сбалансировать количество ссылок в присутствии исключений в основном требует, чтобы каждая функция включает неявное, наконец, блок , чтобы сбалансировать все сохраняющие отсчеты. Это означает, что компилятор должен генерировать много дополнительного кода при отсутствии вероятности того, что какой-либо вызов или другой вызывает исключение. Подавляющее большинство этого кода никогда, никогда не использовалось, но оно должно быть там, раздувая процесс.
Из-за этих проблем Свифт решил не поддерживать традиционные исключения ; вместо этого он позволяет вам делать ошибки в специально выделенных областях кода. Но, как следствие, это означает, что , если что-то пойдет не так в коде, который не может бросить, все, что можно сделать действительно сделать, чтобы предотвратить катастрофу. И в настоящее время, только вещь, которую вы можете разрушить, - это весь процесс.
NSSetUncaughtExceptionHandler доступен скоро: http://stackoverflow.com/questions/25441302/how-should-i-use-nssetuncaughtexceptionhandler-in-swift. Однако он улавливает только исключения Objective-C, а не ошибки времени выполнения Swift или ошибки throw. –
Спасибо @MartinR за ваш быстрый ответ. Я знаю о NSSetUncaughtExceptionHandler, что он обрабатывает исключения Objective-C. Однако я ищу то же/подобное для Swift. –
У Swift нет механизма для обнаружения ошибок во время выполнения. Я могу только догадываться о причине. Например, это не сработает с автоматическим подсчетом ссылок. Вы можете получить лучший ответ от разработчиков Swift в одном из списков рассылки на сайте swift.org. –