Java 你会抛出什么样的异常?

Java 你会抛出什么样的异常?,java,exception,error-handling,Java,Exception,Error Handling,我有一个方法,首先在环境中搜索变量,如果在那里找不到它,它会搜索config.properties。如果两者都没有结果,你会抛出什么异常 NotFoundException听起来很完美,除非它用于在服务器上找不到资源时 那么,什么是运行时异常(String msg)并在消息中澄清 然而,在阅读时,我了解到,如果客户机可以从异常中恢复(他们可以选择设置默认值或其他内容),我应该使用选中的异常。经过检查,我找不到合适的,所以我想我应该抛出异常 我是否回答了自己的问题?只有在极少数情况下,我才会从应用

我有一个方法,首先在环境中搜索变量,如果在那里找不到它,它会搜索
config.properties
。如果两者都没有结果,你会抛出什么异常

NotFoundException
听起来很完美,除非它用于在服务器上找不到资源时

那么,什么是运行时异常(String msg)并在消息中澄清

然而,在阅读时,我了解到,如果客户机可以从异常中恢复(他们可以选择设置默认值或其他内容),我应该使用选中的异常。经过检查,我找不到合适的,所以我想我应该抛出
异常


我是否回答了自己的问题?

只有在极少数情况下,我才会从应用程序代码中抛出预定义的异常。通常我定义自己的异常,就像@Edwin Dalorzo建议的那样。这使您能够在应用程序的更高层进行更细粒度的控制,以决定如何处理它。至少我要做的是有两种不同的类型,一种是致命的(即我无法在应用程序内部处理的故障)和可恢复的故障(即应用程序可以处理的故障)。示例:如果您的应用程序在没有该配置变量的情况下无法运行,那么您将冒泡到应用程序的外层(即web应用程序或web服务中的控制器)是一种致命的情况。如果某个更高的层可以在没有该变量的情况下工作,那么这并不是致命的。主要区别在于:应用程序本身应该处理它还是只处理最外层?

只有在最罕见的情况下,我才会从应用程序代码中抛出预定义的异常。通常我定义自己的异常,就像@Edwin Dalorzo建议的那样。这使您能够在应用程序的更高层进行更细粒度的控制,以决定如何处理它。至少我要做的是有两种不同的类型,一种是致命的(即我无法在应用程序内部处理的故障)和可恢复的故障(即应用程序可以处理的故障)。示例:如果您的应用程序在没有该配置变量的情况下无法运行,那么您将冒泡到应用程序的外层(即web应用程序或web服务中的控制器)是一种致命的情况。如果某个更高的层可以在没有该变量的情况下工作,那么这并不是致命的。主要区别在于:应用程序本身应该处理它还是只处理最外层

我有一个在环境中搜索变量的方法 首先,如果没有找到它,它会搜索config.properties。如果 两者都不会产生结果

这听起来不是很适合定义自己的
异常吗?
让我们来看一个情况:

您正在为银行开发一个应用程序,您想验证用户是否说
A
谁想向另一个用户汇款,比如说
B

因此,在转账之前,我们将检查
A
是否有那么多金额,如果他/她有,我们将结转交易。
什么是
A
没有那么多的平衡?作为负责任的开发人员,您将通知
a
。这里有很多方法可以解决这个问题。但我更愿意在这里定义我自己的异常<代码>不足额余额例外(整数金额)

我有一个在环境中搜索变量的方法 首先,如果没有找到它,它会搜索config.properties。如果 两者都不会产生结果

这听起来不是很适合定义自己的
异常吗?
让我们来看一个情况:

您正在为银行开发一个应用程序,您想验证用户是否说
A
谁想向另一个用户汇款,比如说
B

因此,在转账之前,我们将检查
A
是否有那么多金额,如果他/她有,我们将结转交易。

什么是
A
没有那么多的平衡?作为负责任的开发人员,您将通知
a
。这里有很多方法可以解决这个问题。但我更愿意在这里定义我自己的异常
InsufficentBalanceException(int-amount)

您可以通过编写一个包装类来使用一个未经检查的异常,如果您正在处理资源,它将使用一个自定义消息扩展RuntimeException类

总的来说,您需要将异常传播到应用程序级别,因为启动应用程序时配置确实很重要

示例

ErrorClass.java

public type doSomething(){
...
...
try{
   ...
} catch(FileNotFoundException e){
throw new MyCustomFileNotFoundException("config file not found", e); // no destructive wrapping here
}
}
public class MyCustomFileNotFoundException extends RuntimeException{
    public MyCustomFileNotFoundException(String msg, Throwable cause){
    super(msg, cause);
    }
}
MyCustomFileNotFoundException.java

public type doSomething(){
...
...
try{
   ...
} catch(FileNotFoundException e){
throw new MyCustomFileNotFoundException("config file not found", e); // no destructive wrapping here
}
}
public class MyCustomFileNotFoundException extends RuntimeException{
    public MyCustomFileNotFoundException(String msg, Throwable cause){
    super(msg, cause);
    }
}

您可以通过编写一个包装类来使用未经检查的异常,如果您正在处理资源,该包装类将使用自定义消息扩展RuntimeException类

总的来说,您需要将异常传播到应用程序级别,因为启动应用程序时配置确实很重要

示例

ErrorClass.java

public type doSomething(){
...
...
try{
   ...
} catch(FileNotFoundException e){
throw new MyCustomFileNotFoundException("config file not found", e); // no destructive wrapping here
}
}
public class MyCustomFileNotFoundException extends RuntimeException{
    public MyCustomFileNotFoundException(String msg, Throwable cause){
    super(msg, cause);
    }
}
MyCustomFileNotFoundException.java

public type doSomething(){
...
...
try{
   ...
} catch(FileNotFoundException e){
throw new MyCustomFileNotFoundException("config file not found", e); // no destructive wrapping here
}
}
public class MyCustomFileNotFoundException extends RuntimeException{
    public MyCustomFileNotFoundException(String msg, Throwable cause){
    super(msg, cause);
    }
}

考虑创建一个扩展RuntimeException的异常。 例如,
public类异常扩展了RuntimeException…
(将其命名为有意义的名称,如“BadConfigurationException”)

许多RuntimeException的“争议”都是胡说八道,声称程序可以从意外的无效状态中恢复,而这通常(也许只是经常)不是这样。 如果缺少配置值, 可能没有好的默认值

如果要允许默认值,则为缺少的配置值实现一个默认值,并记录一条消息,说明“警告:缺少配置值。使用默认值:kapow”

100%您不应该