sapphire-lang 0.8.0

Gradually typed scripting language where every value is an object and types are optional, checked at runtime
Documentation
# error_handling.spr — raise, begin/rescue/else/end

# Basic begin/rescue
begin
  raise "something went wrong"
rescue e
  print "Caught: #{e}"
end

# else runs only when no exception is raised
begin
  x = 10 / 2
rescue e
  print "division failed: #{e}"
else
  print "result: #{x}"
end

# Rescue a runtime error (division by zero)
begin
  result = 1 / 0
rescue e
  print "runtime error caught: #{e}"
end

# Raise inside a function with rescue at the call site
def parse_age(s: String) -> Int {
  age = s.to_i
  raise "age must be positive" if age <= 0
  age
}

begin
  print parse_age("25")
  print parse_age("0")
rescue e
  print "bad input: #{e}"
end

# Inline rescue inside a function body
def safe_divide(a: Int, b: Int) -> Int {
  a / b
rescue e
  print "cannot divide by zero, returning 0"
  0
}

print safe_divide(10, 2)
print safe_divide(10, 0)