【问题标题】:Throw my own exceptions?抛出我自己的异常?
【发布时间】:2012-09-26 08:06:10
【问题描述】:

我已经定义了自己的期望类:

public class ProduktException extends Exception {

    public ProduktException(String msg){
    //null
    }

    public static void throwProduktNotCreatedException() throws ProduktException {
        throw new ProduktException("Cannot be created!");
    }

    public static void throwProduktNotDeletedException () throws ProduktException {
        throw new ProduktException("Cannot be deleted!");
    }
}

我的问题是我尝试时不知道如何扔它们:

try {
...
} catch(ProduktNotDeletedException e) {
    e.toString();
}

那行不通……但我想要这些结构!怎么了?

感谢你的回答!!!

更新:

我的问题是,我不想创建多个异常类我想在一个类中包含所有异常。有没有办法解决这个问题?

【问题讨论】:

  • 不起作用是什么意思?您将异常转换为立即丢弃的字符串。当然什么都不会发生。
  • ProduktNotDeletedException 还是ProduktException?为什么你调用 toString 然后什么都不做?为什么不将 msg 传递给超级构造函数?究竟是什么不起作用?
  • 感谢您的回复!!!问题是我想抛出 f.ex.:一个特定的 ProduktNotDeletedException 而不是 ProduktException。因此,如何在不为每个异常创建新类的情况下做到这一点?

标签: java eclipse exception exception-handling


【解决方案1】:

如果您需要区分不同类型的异常,只需创建 2 个不同的异常,可能类似于:

public class ProduktException extends Exception
{
    public ProduktException(String msg){
    //null
    }
}

然后有:

public class ProduktNotDeletedException extends ProduktException
{
    ....
}

public class ProduktNotCreatedException extends ProduktException
{
    ....
}

然后你可以抓住一个或另一个,或两者兼而有之。

try {
    ...
} catch(ProduktNotDeletedException e1) {
    e1.toString();
} catch(ProduktNotCreatedException e2) {
    e2.toString();
} 

编辑:

对于一个班级,我的意思是:

public class ProduktException extends Exception {

    boolean notDeleted;
    boolean notCreated;

    public ProduktException(String msg){
        super(msg);
    }

    public boolean isNotDeleted() {
        return(notDeleted);
    }

    public boolean isNotCreated() {
        return(notCreated);
    }

    public static void throwProduktNotCreatedException() throws ProduktException {
        ProduktException e = new ProduktException("Cannot be created!");
        e.notCreated = true;
        throw e;
    }

    public static void throwProduktNotDeletedException () throws ProduktException {
        ProduktException e = new ProduktException("Cannot be deleted!");
        e.notDeleted = true;
        throw e;
    }
}

然后在你的 try/catch 中:

try {
    ...
} catch(ProduktException e) {
    e.toString();
    if(e.isNotCreated()) {
        // do something
    }
    if(e.isNotDeleted()) {
        // do something
    }
}

【讨论】:

  • 有没有办法不创建不同的新类并将所有内容放在一个类中?
  • @maximus 您可以创建特定的方法或字段。比如 isNotDeleted()isNotCreated(),你可以在你的 catch{} 块中检查它们。
  • 谢谢你的回答!!!但我不太明白你的意思是什么?你能举个例子吗?
  • @maximus 我为特定字段添加了一个示例。
  • @Jon Lin 问题在于,每次他想创建一个新的异常类型时,他都必须更新他的异常类并添加一个新方法。如果他有很多异常类型,这可能会加起来很多方法。
【解决方案2】:

你需要要么抓住ProduktException,例如

try {
  ...
} catch (ProduktException e) {
  e.toString();
}

或声明子类型,例如

public ProduktNotDeletedException extends ProduktException

您可能希望在构造函数中向上传递消息,因此在构造函数中添加以下内容:

super(msg);

【讨论】:

    【解决方案3】:

    下面给出的语法。

    class RangeException extends Exception
    {
        String msg;
    
        RangeException()
        {
            msg = new String("Enter a number between 10 and 100");
        }
    }
    
    public class MyCustomException
    {
        public static void main (String args [])
        {
            try
            {
                int x = 1;
    
                if (x < 10 || x >100) throw new RangeException();
            }
            catch(RangeException e)
            {
                System.out.println (e);
            }
        }
    }
    

    【讨论】:

    【解决方案4】:

    如果您不想为需要抛出的每种不同类型的异常创建多个 ProduktException 子类,您可以在异常中包含一个代码,让您知道哪里出了问题。像这样的:

    public class ProduktException extends Exception {
        private Code exceptionCode;  
        private String message 
    
        public ProduktException(Code code, String msg){
            this.message = msg;
            this.exceptionCode = code;
        }  
    
        //Getters and setters for exceptionCode and message      
    }
    

    代码可以是一个枚举,以便您的应用程序可以知道每个代码对应一个特定的“问题”(未创建产品、未删除产品等)。然后你可以像这样抛出你的异常

    throw new ProduktException(Code.PRODUCT_NOT_CREATED, 
                         "Error while creating product");
    

    当你捕捉到它时,你可以根据代码进行区分。

    catch (ProduktException ex) {
        if (ex.getExceptionCode().equals(Code.PRODUCT_NOT_CREATED)) {
            ...
        }
        else {
            ...
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-06-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-31
      • 2011-11-10
      • 2011-05-30
      相关资源
      最近更新 更多