* Error -> Defect for defects The distinction between Error and Defect is subjective, context-dependent and somewhat arbitrary, so when looking at an exception, it's hard to guess what it is - this happens often when looking at a `raises` list _without_ opening the corresponding definition and digging through layers of inheritance. With the help of a little consistency in naming, it's at least possible to start disentangling the two error types and the standard lib can set a good example here.
103 lines
1.8 KiB
Nim
103 lines
1.8 KiB
Nim
discard """
|
|
output: '''
|
|
Generic except: Test
|
|
Specific except
|
|
Multiple idents in except
|
|
Multiple except branches
|
|
Multiple except branches 2
|
|
'''
|
|
targets: "c"
|
|
"""
|
|
import asyncdispatch, strutils
|
|
|
|
# Here we are testing the ability to catch exceptions.
|
|
|
|
proc foobar() {.async.} =
|
|
if 5 == 5:
|
|
raise newException(IndexDefect, "Test")
|
|
|
|
proc catch() {.async.} =
|
|
# TODO: Create a test for when exceptions are not caught.
|
|
try:
|
|
await foobar()
|
|
except:
|
|
echo("Generic except: ", getCurrentExceptionMsg().splitLines[0])
|
|
|
|
try:
|
|
await foobar()
|
|
except IndexDefect:
|
|
echo("Specific except")
|
|
|
|
try:
|
|
await foobar()
|
|
except OSError, FieldDefect, IndexDefect:
|
|
echo("Multiple idents in except")
|
|
|
|
try:
|
|
await foobar()
|
|
except OSError, FieldDefect:
|
|
assert false
|
|
except IndexDefect:
|
|
echo("Multiple except branches")
|
|
|
|
try:
|
|
await foobar()
|
|
except IndexDefect:
|
|
echo("Multiple except branches 2")
|
|
except OSError, FieldDefect:
|
|
assert false
|
|
|
|
waitFor catch()
|
|
|
|
proc test(): Future[bool] {.async.} =
|
|
result = false
|
|
try:
|
|
raise newException(OSError, "Foobar")
|
|
except:
|
|
result = true
|
|
return
|
|
|
|
proc foo(): Future[bool] {.async.} = discard
|
|
|
|
proc test2(): Future[bool] {.async.} =
|
|
result = false
|
|
try:
|
|
discard await foo()
|
|
raise newException(OSError, "Foobar")
|
|
except:
|
|
result = true
|
|
return
|
|
|
|
proc test3(): Future[int] {.async.} =
|
|
result = 0
|
|
try:
|
|
try:
|
|
discard await foo()
|
|
raise newException(OSError, "Hello")
|
|
except:
|
|
result = 1
|
|
raise
|
|
except:
|
|
result = 2
|
|
return
|
|
|
|
proc test4(): Future[int] {.async.} =
|
|
try:
|
|
discard await foo()
|
|
raise newException(ValueError, "Test4")
|
|
except OSError:
|
|
result = 1
|
|
except:
|
|
result = 2
|
|
|
|
var x = test()
|
|
assert x.waitFor()
|
|
|
|
x = test2()
|
|
assert x.waitFor()
|
|
|
|
var y = test3()
|
|
assert y.waitFor() == 2
|
|
|
|
y = test4()
|
|
assert y.waitFor() == 2
|