Exceptions and Defensive Coding
Result-Like Status
Return a simple status object instead of throwing.
status-result
A small status type can report success or failure without an exception path.
Result-Like Status
ResultLikeStatus.kt
Replay: real traced execution (multi-file project)
class ParseStatus(val ok: Boolean, val text: String)
fun parseCount(raw: String): ParseStatus {
val number = raw.toIntOrNull()
if (number == null) {
return ParseStatus(false, "not-number")
}
return ParseStatus(true, "count:$number")
}
fun main() {
val raw = "6"
val status = parseCount(raw)
val outcome = if (status.ok) {
"ok"
} else {
"fail"
}
println("raw=$raw")
println("outcome=$outcome")
println("text=${status.text}")
}
class ParseStatus(val ok: Boolean, val text: String)
fun parseCount(raw: String): ParseStatus {
val number = raw.toIntOrNull()
if (number == null) {
return ParseStatus(false, "not-number")
}
return ParseStatus(true, "count:$number")
}
fun main() {
val raw = "none"
val status = parseCount(raw)
val outcome = if (status.ok) {
"ok"
} else {
"fail"
}
println("raw=$raw")
println("outcome=$outcome")
println("text=${status.text}")
}
class ParseStatus(val ok: Boolean, val text: String)
fun parseCount(raw: String): ParseStatus {
val number = raw.toIntOrNull()
if (number == null) {
return ParseStatus(false, "not-number")
}
return ParseStatus(true, "count:$number")
}
fun main() {
val raw = "2"
val status = parseCount(raw)
val outcome = if (status.ok) {
"ok"
} else {
"fail"
}
println("raw=$raw")
println("outcome=$outcome")
println("text=${status.text}")
}
raw ← 6
11fun main() {12 val raw→ 6 = "6" //@raw="none", "2"13 val status = parseCount(raw6)14 val outcome = if (status.ok) {number ← 6
3fun parseCount(raw6: String): ParseStatus {4 val number→ 6 = raw6.toIntOrNull()5 if (number == null) {6 return ParseStatus(false, "not-number")7 }8 return ParseStatus(true, "count:$number6")9}outcome ← ok
12 val raw = "6" //@raw="none", "2"13 val status = parseCount(raw6)14 val outcome→ ok = if (status.oktrue) {15 "ok"16 } else {17 "fail"18 }1920 println("raw=$raw6")21 println("outcome=$outcomeok")22 println("text=${status.textcount:6}")23}outputraw=6 outcome=ok text=count:6
raw ← none
11fun main() {12 val raw→ none = "none"13 val status = parseCount(rawnone)14 val outcome = if (status.ok) {number ← null
3fun parseCount(rawnone: String): ParseStatus {4 val number→ null = rawnone.toIntOrNull()5 if (number == null) {if (number == null)
4val number = raw.toIntOrNull()5if (numbernull == null) {6 return ParseStatus(false, "not-number")7}outcome ← fail
12 val raw = "none"13 val status = parseCount(rawnone)14 val outcome→ fail = if (status.okfalse) {15 "ok"16 } else {17 "fail"18 }1920 println("raw=$rawnone")21 println("outcome=$outcomefail")22 println("text=${status.textnot-number}")23}outputraw=none outcome=fail text=not-number
raw ← 2
11fun main() {12 val raw→ 2 = "2"13 val status = parseCount(raw2)14 val outcome = if (status.ok) {number ← 2
3fun parseCount(raw2: String): ParseStatus {4 val number→ 2 = raw2.toIntOrNull()5 if (number == null) {6 return ParseStatus(false, "not-number")7 }8 return ParseStatus(true, "count:$number2")9}outcome ← ok
12 val raw = "2"13 val status = parseCount(raw2)14 val outcome→ ok = if (status.oktrue) {15 "ok"16 } else {17 "fail"18 }1920 println("raw=$raw2")21 println("outcome=$outcomeok")22 println("text=${status.textcount:2}")23}outputraw=2 outcome=ok text=count:2