1)自定义异常有助于明确您的意图。
怎么会这样?其目的是处理或记录异常,而不管该类型是内置的还是自定义的。
我使用自定义异常的主要原因是在不同的上下文中不使用一种异常类型来覆盖相同的问题(例如,系统代码中的参数为空,这可能会受到外部因素和空购物篮的影响)。但是,系统和业务域代码之间的划分以及使用不同的异常类型似乎非常明显,并且没有充分利用自定义异常。与此相关,如果自定义异常包含业务异常,我还可以使用“查找所有引用”在业务域级别获取异常源的所有位置。如果您检查方法中的参数是否为空,使用它们几次,然后添加捕获,是否值得添加异常?不管怎样,一个外部因素或其他一些反常的原因在被检查后会导致论点无效,这是一个现实的风险吗?
2)当异常不应用于控制程序流时,这意味着什么?为什么不呢?我想这就像:
if (exceptionVariable != null) { }
在异常对象中填充每个变量通常是好的做法吗?作为开发人员,您是否希望每个可能的变量都由另一个编码器填充?
我不确定我是否理解您的第一点,但第二点意味着您不应该使用异常来编写这样的代码:
try { if ( something ) { stuff(); if ( something else ) { throw 1; } more_stuff(); } } catch( ... ) { yet_more_stuff(); }
在这里,您只是将异常机制用作一种goto。至于为什么不这样做,我们有goto,它比异常更有效,更清楚的意图。