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

raw
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}")
}
  1. raw ← 6

    11fun main() {12    val raw→ 6 = "6" //@raw="none", "2"13    val status = parseCount(raw6)14    val outcome = if (status.ok) {
  2. 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}
  3. 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
  1. raw ← none

    11fun main() {12    val raw→ none = "none"13    val status = parseCount(rawnone)14    val outcome = if (status.ok) {
  2. number ← null

    3fun parseCount(rawnone: String): ParseStatus {4    val number→ null = rawnone.toIntOrNull()5    if (number == null) {
  3. if (number == null)

    4val number = raw.toIntOrNull()5if (numbernull == null) {6    return ParseStatus(false, "not-number")7}
  4. 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
  1. raw ← 2

    11fun main() {12    val raw→ 2 = "2"13    val status = parseCount(raw2)14    val outcome = if (status.ok) {
  2. 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}
  3. 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