# pseudo-definitions to show how everything behaves
#
# throw(label, val) = # throw a value to a dynamically enclosing block
#
# function rethrow(val)
# global current_exception = val
# throw(current_handler(), current_exception)
# end
#
# rethrow() = rethrow(current_exception)
#
# function throw(val)
# global catch_backtrace = backtrace()
# rethrow(val)
# end
## native julia error handling ##
error(e::Exception) = throw(e)
error{E<:Exception}(::Type{E}) = throw(E())
error(s::String) = throw(ErrorException(s))
error(s...) = throw(ErrorException(string(s...)))
macro unexpected()
:(error("unexpected branch reached"))
end
rethrow() = ccall(:jl_rethrow, Void, ())::None
rethrow(e) = ccall(:jl_rethrow_other, Void, (Any,), e)::None
backtrace() = ccall(:jl_backtrace_from_here, Array{Ptr{Void},1}, ())
catch_backtrace() = ccall(:jl_get_backtrace, Array{Ptr{Void},1}, ())
## system error handling ##
errno() = ccall(:jl_errno, Int32, ())
strerror(e::Integer) = bytestring(ccall(:strerror, Ptr{Uint8}, (Int32,), e))
strerror() = strerror(errno())
systemerror(p, b::Bool) = b ? throw(SystemError(string(p))) : nothing
## assertion functions and macros ##
assert(x) = x ? nothing : error("assertion failed")
macro assert(ex,msg...)
msg = isempty(msg) ? ex : msg[1]
if isdefined(Base,:string)
msg = string("assertion failed: ", msg)
else
# string() might not be defined during bootstrap
msg = :(string("assertion failed: ", $(Expr(:quote,msg))))
end
:($(esc(ex)) ? $(nothing) : error($msg))
end