What is the return type for a function which will possibly raise an error?

For example, if I have a function

function f(x::Int)
    if x == 0
        throw(DivideError())
    return 2.0 / x
end

What return type should I specify at the end of f(x::Int)? Should I consider Union{DivideError, Float64} or just Float64?
I know there is a package ResultTypes.jl that can handle this. But is it necessary to use it?

Throwing an error is not the same as returning an error. This function can only return a Float64 or not return at all:

julia> function f(x::Int)
           if x == 0
               throw(DivideError())
           end
           return 2.0/x
       end
f (generic function with 1 method)

julia> @code_warntype f(1)
Body::Float64
2 1 ─ %1 = (x === 0)::Bool
  └──      goto #3 if not %1
3 2 ─      (Main.throw)($(QuoteNode(DivideError())))
  └──      $(Expr(:unreachable))
5 3 ─ %5 = (Base.sitofp)(Float64, x)::Float64
  │   %6 = (Base.div_float)(2.0, %5)::Float64
  └──      return %6
2 Likes