# 异常 对于框架内部出现的大部分异常类(存在些许例外),他们的提示信息均已经被国际化,而这些异常类在国际化之后也存在了一些额外的规则。 ## 父级异常 在框架内部,存在两个父级异常类:`RobotRuntimeException` 和 `RobotException` 它们的区别就是一个是Runtime的,一个不是。 >[info] 这两个异常类对于国际化语言的特殊规则是一致的,所以统一说明。 ## 异常对应Tag 对于这两个异常类及其子类,Tag标签分为三部分:`一级Tag.二级Tag.后续三级Tag` 例如: ```properties exception.run.moreDepends=Scan to multiple [{0}] implementation classes. ``` 可以看到,上述的`exception`就是一级Tag,而`run`就是二级Tag,后续其他的就是三级Tag。 ## 默认情况下: - 一级Tag必然是`exception` - 二级Tag会根据当前异常类进行格式化,如果: - 异常类命名符合:`XxxxXxxException` 的格式,并首字符小写并移除尾部的`Exception`。 例如:`RunException` -> `run` - 异常类命名符合:`XXXxxxXxxxException`的格式,即开头连续的大写字符,则仅移除尾部的`Exception` 例如:`CQParamException` -> `CQParam` - 其余情况不做处理。例如:`MyError` -> `MyError` - 三级Tag则是你在`new 异常类`的时候所使用的字符串参数。 例如有这么一个`MyErrException`异常类继承了`RobotRuntimeException`,并定义了如下一个语言信息: ```properties exception.myErr.hello=我出错了! ``` 那么当你抛出这个异常或者获取他的`message`信息的时候(此处以抛出异常举例),只需要这么写: ```java throw new MyErrException("hello"); ``` 输出信息: ``` Exception in thread "main" com.forte.MyErrException: 我出错了! at xxxx... ``` >[success] 也就是说,在new一个这样的异常类的时候,字符串参数只需要填上三级Tag即可。 >[success] 当然,支持format参数。 ## **我不想这样?** 如果想要自定义二级Tag,你可以重写`getExceptionTag()`方法。 如果想要自定义一级+二级Tag,你可以重写`getMessageTag()`方法。 如果你想直接禁用使用Tag初始化来异常类,你可以重写`initTag(Object...)`方法,使此方法无效化。