Skip to content

Commit

Permalink
Merge pull request #14015 from JuliaLang/teh/systemerror
Browse files Browse the repository at this point in the history
mkdir: supply path to SystemError
  • Loading branch information
timholy committed Nov 17, 2015
2 parents ed50330 + 104118d commit 8c23dc8
Show file tree
Hide file tree
Showing 5 changed files with 22 additions and 4 deletions.
4 changes: 3 additions & 1 deletion base/base.jl
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,9 @@ end
type SystemError <: Exception
prefix::AbstractString
errnum::Int32
SystemError(p::AbstractString, e::Integer) = new(p, e)
extrainfo
SystemError(p::AbstractString, e::Integer, extrainfo) = new(p, e, extrainfo)
SystemError(p::AbstractString, e::Integer) = new(p, e, nothing)
SystemError(p::AbstractString) = new(p, Libc.errno())
end

Expand Down
2 changes: 1 addition & 1 deletion base/error.jl
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ kwerr(kw) = error("unrecognized keyword argument \"", kw, "\"")

## system error handling ##

systemerror(p, b::Bool) = b ? throw(Main.Base.SystemError(string(p))) : nothing
systemerror(p, b::Bool; extrainfo=nothing) = b ? throw(Main.Base.SystemError(string(p), Libc.errno(), extrainfo)) : nothing

## assertion functions and macros ##

Expand Down
2 changes: 1 addition & 1 deletion base/file.jl
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,7 @@ cd(f::Function) = cd(f, homedir())
function mkdir(path::AbstractString, mode::Unsigned=0o777)
@unix_only ret = ccall(:mkdir, Int32, (Cstring,UInt32), path, mode)
@windows_only ret = ccall(:_wmkdir, Int32, (Cwstring,), path)
systemerror(:mkdir, ret != 0)
systemerror(:mkdir, ret != 0; extrainfo=path)
end

function mkpath(path::AbstractString, mode::Unsigned=0o777)
Expand Down
8 changes: 7 additions & 1 deletion base/replutil.jl
Original file line number Diff line number Diff line change
Expand Up @@ -136,7 +136,13 @@ function showerror(io::IO, ex::DomainError, bt; backtrace=true)
nothing
end

showerror(io::IO, ex::SystemError) = print(io, "SystemError: $(ex.prefix): $(Libc.strerror(ex.errnum))")
function showerror(io::IO, ex::SystemError)
if ex.extrainfo == nothing
print(io, "SystemError: $(ex.prefix): $(Libc.strerror(ex.errnum))")
else
print(io, "SystemError (with $(ex.extrainfo)): $(ex.prefix): $(Libc.strerror(ex.errnum))")
end
end
showerror(io::IO, ::DivideError) = print(io, "DivideError: integer division error")
showerror(io::IO, ::StackOverflowError) = print(io, "StackOverflowError:")
showerror(io::IO, ::UndefRefError) = print(io, "UndefRefError: access to undefined reference")
Expand Down
10 changes: 10 additions & 0 deletions test/file.jl
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,16 @@ subdir = joinpath(dir, "adir")
mkdir(subdir)
subdir2 = joinpath(dir, "adir2")
mkdir(subdir2)
@test_throws SystemError mkdir(file)
let err = nothing
try
mkdir(file)
catch err
io = IOBuffer()
showerror(io, err)
@test takebuf_string(io) == "SystemError (with $file): mkdir: File exists"
end
end

if @unix? true : (Base.windows_version() >= Base.WINDOWS_VISTA_VER)
dirlink = joinpath(dir, "dirlink")
Expand Down

0 comments on commit 8c23dc8

Please sign in to comment.