Подводя итог вышеприведенному обсуждению: В вашем подходе есть различные проблемы:
Аргументом к NSSetUncaughtExceptionHandler
является указатель на функцию C. Вы можете передать замыкание в Swift, но только если замыкание не захватывает какой-либо контекст. В вашем случае замыкание не может использовать self
. Решение из Как использовать метод экземпляра в качестве обратного вызова для функции, которая принимает только функцию или закрытие литерала ? не может использоваться здесь, потому что NSSetUncaughtExceptionHandler()
не имеет параметра «context».
Даже если вам удастся сослаться на делегат приложения в обработчике исключений: он может вызываться в любом потоке, поэтому может вызываться неопределенное поведение для вызова любых связанных с пользовательским интерфейсом методов, таких как добавление представлений или меток. [ 1113]
NSSetUncaughtExceptionHandler
ловит только исключения Objective-C, но не ошибки Swift (из throw
) или исключения среды выполнения Swift (такие как «неожиданно найденный ноль»).
Даже если исключение поймано, вы не можете «обработать» его таким образом, чтобы программа продолжала впоследствии. Он все равно рухнет.
Вы написали в комментарии
Я хочу справиться с этим, когда получаю нулевые значения из моего API ... но чтобы быть в безопасности, я хочу предотвратить приложение от авария.
blockquote>Обработчик исключений не подходит для этой цели. Используйте необязательную привязку, дополнительные приведения, охранники и т. Д. Для обработки ответа и избегайте исключений времени выполнения.
Целое число overflow… или более точно, потеря значимости.
Вместо этого сделайте явное сравнение:
private static final Comparator<Thing> reverse = new Comparator<Thing>() {
public int compare(Thing a, Thing b) {
int av = a.getValue(), bv = b.getValue();
return (av == bv) ? 0 : ((av < bv) ? -1 : +1);
}
};
Используя вычитание прекрасен, если Вы уверены, что различие не "повторится". Например, когда рассматриваемые значения вынуждены быть неотрицательными.
При сравнении примитивов Java желательно преобразовать их в их Объектные дубликаты и полагаться на их compareTo()
методы.
В этом случае можно сделать:
return Integer.valueOf(a.getValue()).compareTo(b.getValue())
, Когда в сомнении, пользуйтесь хорошо протестированной библиотекой.
Вы не можете использовать минус для создания сравнения. Вы переполнитесь, когда абсолютная разность превысит Integer.MAX_VALUE
.
Вместо этого используйте этот алгоритм:
int compareInts( int x, int y ) {
if ( x < y ) return -1;
if ( x > y ) return 1;
return 0;
}
мне нравится иметь эту функцию в библиотеке в таких целях.
попробуйте
System.out.println(Integer.MAX_Value - Integer.MIN_VALUE);
, Это должно возвратить положительное число как MAX_VALUE> MIN_VALUE, но вместо этого печатает-1
Какие числа Вы бросаете там? Если Ваши количества являются достаточно большими, Вы могли бы перенестись через значения МИН/Макса для целых чисел и закончить в путанице.
Если величина a очень отрицательна, и значение b очень положительно, что Ваш ответ будет очень неправильным.
IIRC, Международное переполнение тихо повторяется в JVM
- MarkusQ