10: 异常处理
在编程过程中,错误是不可避免的。处理这些错误,以防止程序崩溃,提供有用的错误信息或尝试解决问题,这就是异常处理的目的。基本异常处理
Ruby 提供了 begin-rescue 结构来处理异常。基本的语法如下:
		Ruby:
	
	begin
  # 可能会发生异常的代码
rescue
  # 处理异常的代码
end
	例如:
		Ruby:
	
	begin
  # 尝试除以零
  result = 10 / 0
rescue
  # 捕获并处理异常
  print "除数不能为零!"
end
	这个代码尝试执行 10 除以 0,这会引发一个异常。rescue 块会捕获这个异常并输出一条错误信息,而不是让程序崩溃。
捕获特定的异常
你可以捕获特定类型的异常,而不仅仅是所有的异常。Ruby 中的异常类是层次结构的,可以捕获不同层次的异常。
		Ruby:
	
	begin
  result = 10 / 0
rescue ZeroDivisionError
  print "除数不能为零!"
rescue StandardError
  print "发生了一个标准错误!"
end
	在这个例子中,我们明确捕获 ZeroDivisionError 异常。如果发生其他类型的异常,第二个 rescue 会捕获它。
获取异常信息
在 rescue 块中,你可以访问异常对象以获取更多信息:
		Ruby:
	
	begin
  result = 10 / 0
rescue ZeroDivisionError => e
  print "错误信息: #{e.message}"
  print "错误类型: #{e.class}"
end
	ensure 块
ensure 块中的代码无论是否发生异常都会执行。它通常用于清理资源,如关闭文件或网络连接:
		Ruby:
	
	begin
  file = File.open("example.txt", "w")
  # 可能会发生异常的代码
rescue
  print "处理异常..."
ensure
  file.close if file
  print "文件已关闭"
end
	raise 语句
你可以使用 raise 语句手动引发异常:
		Ruby:
	
	def divide(a, b)
  raise ArgumentError, "除数不能为零" if b == 0
  a / b
end
begin
  divide(10, 0)
rescue ArgumentError => e
  print "错误: #{e.message}"
end
	自定义异常
你可以创建自定义的异常类来处理特定的错误情况:
		Ruby:
	
	class CustomError < StandardError
end
def do_something_risky
  raise CustomError, "发生自定义错误"
end
begin
  do_something_risky
rescue CustomError => e
  print "捕获自定义错误: #{e.message}"
end
	重新引发异常
有时你捕获异常后,处理一些事情并希望重新引发它:
		Ruby:
	
	begin
  result = 10 / 0
rescue ZeroDivisionError => e
  print "捕获到错误: #{e.message}"
  raise # 重新引发异常
end