2

toString在我的类中有覆盖那些的标准方法Object

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

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

6 回答 6

3

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

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

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

假想的checkProductNumber方法truegetProductNumbercall 不会 throw时返回ProductExceptionfalse否则返回。制作一个类似的方法checkProductNumber并使用它而不是捕获异常是一种更好的编码方法的方法,在正常程序流程中捕获异常。

于 2013-07-05T10:14:51.903 回答
2

在 toString 中使用 Try/Catch 不是常规做法,但在 toString method() 中使用 try/catch 没有任何限制。
但是如果你想在你的代码中删除 try/catch,那么你必须知道谁抛出了这个ProductException异常以及抛出这个异常的条件是什么。

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

注意:最佳实践表明,在那些包含一些数据的类中,toString() 方法总是被覆盖,而在那些类型的类中,getter/setter 仅用于获取和设置值,因此不会出现异常。
如果您想对数据进行一些操作,请尝试在此类之外执行此操作。使用这些类型的类只包含数据而不在类内部执行操作(仅在非常需要时才进行小操作)

于 2013-07-05T10:27:38.057 回答
0

如果该方法product.getProductNumber()可能会抛出 ProductException 这是正确的方法。

于 2013-07-05T10:09:39.507 回答
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;
}
于 2013-07-05T10:04:55.730 回答
0

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

于 2013-07-05T10:05:16.880 回答
0

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

于 2013-07-05T10:06:12.267 回答