在toString方法中尝试Catch块

时间:2013-07-05 09:58:15

标签: java try-catch tostring

在我的班级中使用toString标准方法覆盖Object个。

在这种方法中使用try catch是一种好习惯吗?

@Override
public String toString() {
    try {
        return 
                "number='" + product.getProductNumber() + 
                ", locale=" + locale;
    } catch (ProductException e) {
        return super.toString();
    }
}

6 个答案:

答案 0 :(得分:3)

不,这不是正常做法。应该使用例外来处理异常情况,而不是常规代码流。

您的代码使用try / catch来检测可以在不引入异常的情况下处理的情况。它大致相当于以下方法:

@Override
public String toString() {
    if (product.checkProductNumber()) {
        return "number='" + product.getProductNumber() + 
               ", locale=" + locale;
    } else {
        return super.toString();
    }
}

虚拟checkProductNumber方法在true调用不会抛出getProductNumber时返回ProductException,否则返回false。制作像checkProductNumber这样的方法并使用它而不是捕获异常是一种更好的方法来编写在正常程序流程中捕获异常的方法。

答案 1 :(得分:2)

在toString中使用try / Catch而非normat实践,但在toString方法()中使用try / catch没有限制。
但是如果你想在代码中删除try / catch,那么你必须知道谁抛出这个ProductException异常以及抛出这个异常的条件是什么。

  • 如果检查此异常,那么在这种情况下,您可以使用boolean选项创建临时方法,以检查此操作是否正常运行或抛出异常。如@dasblinkenlight回答。
  • 所示

注意:最佳实践说toString()方法总是在包含一些数据的classess中被覆盖,并且在这些类型的类中,getter / setter仅用于获取和设置值,因此不存在异常的可能性。 /> 如果你想对数据做一些操作,那么试着在这个类之外做。使用这些类型的类只包含数据,并且不在类内执行操作(只有在极端需要时才执行小操作)

答案 2 :(得分:0)

我没有看到任何明显的理由不这样做。但是,如果抛出ProductException,您当前的提议将丢失语言环境信息。除非你只想要这个或者super.toString(),否则你应该做这样的事情:

@Override
public String toString() {
    String number = null;
    try {
        number = product.getProductNumber();
    } catch (ProductException e) {
        number = "unknown: " + e.getMessage(); // or something like this
    }
    // here you may or may not include super.toString()
    return super.toString() + ", number=" + number + ", locale=" + locale;
}

答案 3 :(得分:0)

我还没有在toString中看到try-catch的用法。但是如果你使用一些可以抛出异常的方法,那么在toString中使用try-catch时我没有看到任何问题

答案 4 :(得分:0)

是的,这没有任何问题。如果您知道toString()中会发生任何异常,那么您可以在其中使用try-catch{ }

答案 5 :(得分:0)

如果方法product.getProductNumber()可能抛出ProductException,那么它是正确的方法。