Java 例外-为什么还要费心扔?
所以,我知道这听起来有点极端,但我想指出一点: 嗯。因此,我的代码不关心抛出的异常类型,99.9%的情况下,如果抛出异常,无论发生什么,它都会以相同的方式处理 现在,我为什么还要在代码中抛出\创建新异常呢? 显然,我使用的所有库都已经抛出了它们,而且这些库的信息也非常丰富 为我的方法传递了null对象?谁在乎呢,我会自动抛出一个空指针异常 你能提出一个很好的论点吗?为什么我应该创建新的异常并抛出它们 编辑我的意思: 为什么要这么麻烦呢:Java 例外-为什么还要费心扔?,java,exception,exception-handling,try-catch,Java,Exception,Exception Handling,Try Catch,所以,我知道这听起来有点极端,但我想指出一点: 嗯。因此,我的代码不关心抛出的异常类型,99.9%的情况下,如果抛出异常,无论发生什么,它都会以相同的方式处理 现在,我为什么还要在代码中抛出\创建新异常呢? 显然,我使用的所有库都已经抛出了它们,而且这些库的信息也非常丰富 为我的方法传递了null对象?谁在乎呢,我会自动抛出一个空指针异常 你能提出一个很好的论点吗?为什么我应该创建新的异常并抛出它们 编辑我的意思: 为什么要这么麻烦呢: public myMethod() { try {
public myMethod() {
try {
doStuff1();
}
catch(Exception e) {
throw new Exception("Error in doStuff1");
}
try {
doStuff2();
}
catch(Exception e) {
throw new Exception("Error in doStuff2");
}
当我可以使用此选项时:
public myMethod() {
doStuff1();
doStuff2();
}
您的客户需要详细的错误报告。哪里出了问题,哪里出了问题
他们不知道空指针异常是什么。即使如此,如果没有堆栈跟踪,这本身也不是特别有用。那么一个空指针被传递到您的RetrieveReportX方法中?检查它是否为null并引发ReportXNoIdentifierException,而不是让它自动引发null指针异常。然后,您将在某个地方有一个错误处理程序,根据这些自定义异常,它可以准确地报告(人工)过程中出现的错误,并且您的客户很高兴,因为他们看到的不是[stacktrace]上的NullPointerException,而是“试图检索报告X时未提供标识符。”您的客户需要详细的错误报告。哪里出了问题,哪里出了问题 他们不知道空指针异常是什么。即使如此,如果没有堆栈跟踪,这本身也不是特别有用。那么一个空指针被传递到您的RetrieveReportX方法中?检查它是否为null并引发ReportXNoIdentifierException,而不是让它自动引发null指针异常。然后,您将在某个地方有一个错误处理程序,根据这些自定义异常,它可以准确地报告(人工)过程中出现的错误,并且您的客户很高兴,因为他们看到的不是[stacktrace]上的NullPointerException,而是“试图检索报告X时未提供标识符。” 为什么我要创建新的异常并抛出它们 在某些情况下,故意抛出
异常是常见且良好的做法。
接受
非法辩论例外
如果您的方法只接受特定范围内的参数,例如仅接受正数,则应检查无效参数并抛出IllegalArgumentException
例如:
public int calculateFactorial(int n) {
if (n < 0)
throw new IllegalArgumentException("n must be positive");
if (n >= 60)
throw new IllegalArgumentException("n must be < 60");
...
}
public void findFactorial(int n)
{
try{
calculateFactorial(n)
}catch(IllegalArgumentException ie){
System.out.println(ie.getMessage());
}
}
public int calculateFactorial(int n){
if(n<0)
抛出新的IllegalArgumentException(“n必须为正”);
如果(n>=60)
抛出新的IllegalArgumentException(“n必须小于60”);
...
}
公共无效FindFactory(int n)
{
试一试{
计算系数(n)
}捕获(IllegalArgumentException ie){
System.out.println(即getMessage());
}
}
为什么我要创建新的异常并抛出它们
在某些情况下,故意抛出异常是常见且良好的做法。
接受
非法辩论例外
如果您的方法只接受特定范围内的参数,例如仅接受正数,则应检查无效参数并抛出IllegalArgumentException
例如:
public int calculateFactorial(int n) {
if (n < 0)
throw new IllegalArgumentException("n must be positive");
if (n >= 60)
throw new IllegalArgumentException("n must be < 60");
...
}
public void findFactorial(int n)
{
try{
calculateFactorial(n)
}catch(IllegalArgumentException ie){
System.out.println(ie.getMessage());
}
}
public int calculateFactorial(int n){
if(n<0)
抛出新的IllegalArgumentException(“n必须为正”);
如果(n>=60)
抛出新的IllegalArgumentException(“n必须小于60”);
...
}
公共无效FindFactory(int n)
{
试一试{
计算系数(n)
}捕获(IllegalArgumentException ie){
System.out.println(即getMessage());
}
}
优点1:将错误处理代码与“常规”代码分离
优点2:将错误传播到调用堆栈
优点3:分组和区分错误类型
答复
过于通用的异常处理程序可以捕获和处理程序员没有预料到且处理程序不适用的异常,从而使代码更容易出错
如前所述,您可以创建异常组并以常规方式处理异常,也可以使用特定的异常类型区分异常并以精确的方式处理异常
优点1:将错误处理代码与“常规”代码分离
优点2:将错误传播到调用堆栈
优点3:分组和区分错误类型
答复
过于通用的异常处理程序可以捕获和处理程序员没有预料到且处理程序不适用的异常,从而使代码更容易出错
如前所述,您可以创建异常组并以常规方式处理异常,也可以使用特定的异常类型区分异常并以精确的方式处理异常
许多好的问题都会根据专家经验产生一定程度的意见,但这个问题的答案往往几乎完全基于意见,而不是事实、参考或特定的专业知识。你是说声明新的异常类还是新的异常实例?你的问题目前还不清楚。如果你能提供具体的例子,这将是非常有用的。正如@hexafraction所建议的,这是一个相当主观的问题,围绕它所处的环境会有很多不同的观点。对于阅读您的问题的用户来说,您编程的级别目前尚未定义,因此我们不知道您是否编程了任何实际需要适当异常处理的内容。你所建议的关于使用库的概念可能还表明你从未创建过自己的库,这导致你认为异常处理是毫无意义的