仓颉开发之——异常(14)

一 概述

  • 定义异常
  • 处理异常
  • 常见运行时异常
  • 使用 Option

二 定义异常

2.1 概念

  • 异常是一类特殊的可以被程序员捕获并处理的错误

2.2 异常分类

1-Error

  • 系统内部错误和资源耗尽错误
  • 应用程序不应该抛出这种类型错误
  • 如果出现内部错误,只能通知给用户,尽量安全终止程序

2-Exception

  • 程序运行时的逻辑错误或者 IO 错误导致的异常
  • 这类异常需要在程序中捕获处理

2.3 定义异常

  • 自定义类<: Exception
  • open class FatherException <: Exception {public open func printException() {}}

三 处理异常

3.1 throw抛出异常

  • throw 之后的表达式必须是 Exception 的子类型
  • throw 关键字抛出的异常需要被捕获处理
  • throw NegativeArraySizeException("I am an Exception!")

3.2 try处理异常

1-普通try表达式

  • 三个部分:try 块,catch 块和 finally 块
  • try 后面紧跟的块以及每个 catch 块的的作用域互相独立
  • try {throw Exception("Exception") } catch (e: Exception) { } finally { }

2-Try-with-resources 表达式

  • 主要是为了自动释放非内存资源
  • try-with-resources 表达式中的 catch 块和 finally 块均是可选的
  • 此类要继承Resource ,并实现isClosed()和close()方法
  • 自定义类继承Resource:class R <: Resource {public func isClosed(): Bool {true }public func close(): Unit { }}

3-CatchPattern 进阶

  • 1-类型模式:catch (e: IllegalArgumentException | NegativeArraySizeException)
  • 2-通配符模式:catch (_) {}

四 常见运行时异常

  1. ConcurrentModificationException:并发修改产生的异常
  2. IllegalArgumentException:传递不合法或不正确参数时抛出的异常
  3. NegativeArraySizeException: 创建大小为负的数组时抛出的异常
  4. NoneValueException:值不存在时产生的异常,如 Map 中不存在要查找的 key
  5. OverflowException:算术运算溢出异常

五 使用 Option

5.1 原因

  • Option 类型可以同时表示有值和无值两种状态
  • 无值在某些情况下也可以理解为一种错误,所以 Option 类型也可以用作错误处理

5.2 使用场景

  1. 模式匹配
  2. coalescing 操作符(??)
  3. 问号操作符(?)
  4. getOrThrow 函数

六 思维导图

七 参考

  • 仓颉官方文档—异常
  • 仓颉编程语言入门教程