Выявление ошибки не вызывающим метания методом - PullRequest
1 голос
/ 08 мая 2020

Swift

Целые числа в Swift допустимы. «Они не могут быть бесконечными, как Двойники, - подумал он. У них есть предел.
Превышение этого лимита вызовет ошибку sh.

Приложение A
Int(10000000000000000000)
error: integer literal '10000000000000000000' overflows when stored into 'Int'

Приложение B
Int(pow(Double(1000000000), Double(10)))
Fatal error: Double value cannot be converted to Int because the result would be greater than Int.max

Я наивно подумал про себя: «Эй, это фатальная ошибка. Можно ли отловить ошибку с помощью блока do, catch?»
Нет

Пример C

do {
    Int(pow(Double(1000000000), Double(10)))
} catch {
    print("safety net")
}
print("good?")

warning: 'catch' block is unreachable because no errors are thrown in 'do' block
Fatal error: Double value cannot be converted to Int because the result would be greater than Int.max

О да. Это правильно! Забыл добавить попробовать
Нет

Приложение D

do {
    try Int(pow(Double(1000000000), Double(10)))
} catch {
    print("safety net")
}
print("good?")

warning: no calls to throwing functions occur within 'try' expression
warning: 'catch' block is unreachable because no errors are thrown in 'do' block
Fatal error: Double value cannot be converted to Int because the result would be greater than Int.max

Что происходит?

Кто-нибудь может мне это объяснить? Мне бы очень хотелось иметь возможность catch такой ошибки.
Большое спасибо, это было бы огромным подспорьем!

1 Ответ

2 голосов
/ 08 мая 2020

Вы можете использовать конструктор init(exactly:), он не выдаст ошибку, но вернет nil, если значение слишком велико

guard let value = Int(exactly: pow(Double(1000000000), Double(10))) else {
    //error handling
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...