mirror of
https://github.com/nim-lang/Nim.git
synced 2026-04-19 05:50:30 +00:00
doAssertRaises improvements; nimscript supports except Exception as e (#15765)
* doAssertRaises now correctly handles foreign exceptions; now shows which exception is raised on mismatch * nimscript now handles `Exception as e` * remove catch-all doAssertRaises overload from this PR Co-authored-by: Andreas Rumpf <rumpf_a@web.de>
This commit is contained in:
@@ -31,10 +31,11 @@
|
||||
- Removed deprecated `iup` module from stdlib, it has already moved to
|
||||
[nimble](https://github.com/nim-lang/iup).
|
||||
|
||||
|
||||
- `doAssertRaises` now correctly handles foreign exceptions.
|
||||
|
||||
## Language changes
|
||||
|
||||
- `nimscript` now handles `except Exception as e`
|
||||
- The `cstring` doesn't support `[]=` operator in JS backend.
|
||||
|
||||
|
||||
|
||||
@@ -2360,7 +2360,8 @@ when notJSnotNims and hostOS != "standalone":
|
||||
##
|
||||
## **Warning**: Only use this if you know what you are doing.
|
||||
currException = exc
|
||||
|
||||
elif defined(nimscript):
|
||||
proc getCurrentException*(): ref Exception {.compilerRtl.} = discard
|
||||
|
||||
when notJSnotNims:
|
||||
{.push stackTrace: off, profiler: off.}
|
||||
|
||||
@@ -81,20 +81,23 @@ template onFailedAssert*(msg, code: untyped): untyped {.dirty.} =
|
||||
code
|
||||
|
||||
template doAssertRaises*(exception: typedesc, code: untyped) =
|
||||
## Raises ``AssertionDefect`` if specified ``code`` does not raise the
|
||||
## specified exception. Example:
|
||||
## Raises ``AssertionDefect`` if specified ``code`` does not raise `exception`.
|
||||
## Example:
|
||||
##
|
||||
## .. code-block:: nim
|
||||
## doAssertRaises(ValueError):
|
||||
## raise newException(ValueError, "Hello World")
|
||||
var wrong = false
|
||||
const begin = "expected raising '" & astToStr(exception) & "', instead"
|
||||
const msgEnd = " by: " & astToStr(code)
|
||||
template raisedForeign = raiseAssert(begin & " raised foreign exception" & msgEnd)
|
||||
when Exception is exception:
|
||||
try:
|
||||
if true:
|
||||
code
|
||||
wrong = true
|
||||
except Exception:
|
||||
discard
|
||||
except Exception as e: discard
|
||||
except: raisedForeign()
|
||||
else:
|
||||
try:
|
||||
if true:
|
||||
@@ -102,9 +105,7 @@ template doAssertRaises*(exception: typedesc, code: untyped) =
|
||||
wrong = true
|
||||
except exception:
|
||||
discard
|
||||
except Exception:
|
||||
raiseAssert(astToStr(exception) &
|
||||
" wasn't raised, another error was raised instead by:\n"&
|
||||
astToStr(code))
|
||||
except Exception as e: raiseAssert(begin & " raised '" & $e.name & "'" & msgEnd)
|
||||
except: raisedForeign()
|
||||
if wrong:
|
||||
raiseAssert(astToStr(exception) & " wasn't raised by:\n" & astToStr(code))
|
||||
raiseAssert(begin & " nothing was raised" & msgEnd)
|
||||
|
||||
@@ -81,3 +81,9 @@ block: # #14142
|
||||
discard dirExists("/usr")
|
||||
discard fileExists("/usr/foo")
|
||||
discard findExe("nim")
|
||||
|
||||
block:
|
||||
doAssertRaises(AssertionDefect): doAssert false
|
||||
try: doAssert false
|
||||
except Exception as e:
|
||||
discard
|
||||
|
||||
Reference in New Issue
Block a user