这种 Java 异常实践怎么样? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
爱意满满的作品展示区。
copymaster

这种 Java 异常实践怎么样?

  •  
  •   copymaster 2021 年 10 月 10 日 2984 次点击
    这是一个创建于 1658 天前的主题,其中的信息可能已经有所发展或是发生改变。

    昨天我发了一个一种无 HTTPS 的安全通信方式帖子,结果不到半个小时就结贴了,今天我又来推广我的 idea 了,大家来看看这个是不是也无用

    事情起因是这样的,对于 java 异常的使用我始终不明白最佳实践是什么,对于 log 中的异常不能确定是自己抛的忘了 catch 还是使用 api 不当造成的,后来我苦思冥想想到了一种 java 异常的实践: 对于程序中考虑到的异常全部都用自定义的异常,每个项目都配置一个根异常类,比如说 XXXAppException 作为这个 app 的根异常,后续异常全部都继承这个。在 Java 领域,无论是 web 还是 Android 都有一个统一接收未 catch 异常的地方,android 的捕捉异常机制好像是 UncaughtExceptionHandler,web spring 也能捕捉所有抛出的未 catch 的异常。我们只需要在异常终点这里辨别抛出的异常是不是 XXXAppException 及其子异常就可以了。如果是,说明这个异常是开发阶段考虑到的,在异常类中我们也可以定义一些该异常的相关信息,比如异常码,提示信息等;如果不是,可以马上把这个异常报告给开发人员,这个异常是开发阶段没考虑到的,会酿成什么事故还不能确定,需要开发人员立即处理。

    为了实践这个理论,我还做了一个生成异常类的项目

    https://github.com/helloliuyiming/java-exception-class-generator

    奈何前端技术太菜,现在这阶段根本不能用,等秋招过去有时间就完善。

    大家觉得这个怎么样?

    4 条回复    2021-10-11 00:11:35 +08:00
    ipwx
        1
    ipwx  
       2021 年 10 月 10 日
    1. 对于在开发阶段能考虑到的、确实可能发生的东西,我一般不抛异常,而是打日志。。。ERROR 级别或者 CRITICAL 级别。
    2. 自己系统里面抛出去不处理的异常,一般是你这个程序无法继续执行了。直接往上抛就行。
    3. 真的没必要全都包装一下,本来对于 API 的异常,如果是你开发阶段不处理的,那说明它发生的时候,你的代码对此无能为力,应该直接网上 bypass 。只有你预料到 API 会发生的异常,才需要自己处理一下,重新包装或者直接就地打 log 并且做错误处理。
    4. 自己的子系统内部和外部,其实你把子系统看做 API,仿照 3) 处理就行。
    5. 异常的定位不能靠类型,要靠 stacktrace
    copymaster
        2
    copymaster  
    OP
       2021 年 10 月 10 日
    @ipwx 日志是必需的,你第一条的不抛异常打日志这怎么处理的,有异常任它崩溃崩溃后收集异常信息?
    我表达的这个主要目的不是定位,而是把手动抛得异常也当作系统的一部分,不是手动抛得就是程序运行超过了边界发生了意想不到的情况。
    ipwx
        3
    ipwx  
       2021 年 10 月 10 日
    有意识的抛异常确实没毛病。不过我的一个 C++ 项目根本没整那么多子类型,统统我的 AppException 扔出去得了。反正有日志级别和 stacktrace 。

    不能处理的异常到上一层呀。如果是 webapp 不是有 per-request 的异常日志嘛
    zhzy0077
        4
    zhzy0077  
       2021 年 10 月 11 日
    事实上楼主你说的 就是绝大多数业务 Java 代码处理异常操作的逻辑 在业务处理层所有的校验出错都抛一个 ApplicationException 然后在 exception handler 里统一做 l10n 之后吐给客户端
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     1051 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 31ms UTC 18:21 PVG 02:21 LAX 11:21 JFK 14:21
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86