Ak potrebujeme vlastný typ výnimky, jednoducho vytvoríme triedu, ktorá dedí z Exception:
class InsufficientFundsException(amount: Double) :
Exception("Nedostatocny zostatok! Potrebujes $amount EUR")
class BankAccount(private var balance: Double = 0.0) {
fun withdraw(amount: Double) {
if (amount > balance) {
throw InsufficientFundsException(amount - balance)
}
balance -= amount
println("Vybrate: $amount, Zostatok: $balance")
}
fun deposit(amount: Double) {
balance += amount
}
}
fun main() {
val account = BankAccount()
account.deposit(100.0)
account.withdraw(50.0) // Vybrate: 50.0, Zostatok: 50.0
account.withdraw(75.0) // vyhodi InsufficientFundsException
}
V Kotline existuje dedičská hierarchia výnimiek:
Throwable - základná trieda
Exception - ozajstné chyby (môžeme odchytávať)
RuntimeException - chyby bežiaceho času (nepovinné odchytávanie)
IllegalArgumentExceptionIllegalStateExceptionNumberFormatExceptionIOException - chyby vstupu/výstupuError - kritické chyby JVM (nemá zmysel odchytávať)V Kotline sú všetky výnimky unchecked (na rozdiel od Javy). To znamená, že nemusíme deklarovať, aké výnimky môže funkcia vyhodiť:
// V Jave by sme museli napisat throws FileNotFoundException
// V Kotline to nie je potrebne
fun readFile(path: String): String {
return File(path).readText()
}
Unchecked výnimky nemusíme odchytávať, ale ak to nespravíme a výnimka nastane, program spadne.
Vytvor vlastnú výnimku NeplatneHesloException s popisnou správou.
V triede Registracia vyhoď túto výnimku, ak má heslo menej než osem znakov.
V main vlastnú výnimku odchyť a vypíš používateľovi jej správu.