捕获Java中toString方法的异常
最近我在GitHub上看到了以下代码:捕获Java中toString方法的异常,java,exception,tostring,throwable,Java,Exception,Tostring,Throwable,最近我在GitHub上看到了以下代码: private static String safeToString(Object obj) { if (obj == null) return null; try { return obj.toString(); } catch (Throwable t) { return "Error occured"; } } 我从未将toString()方法调用放在try-catch块中。但现在当我
private static String safeToString(Object obj) {
if (obj == null) return null;
try {
return obj.toString();
} catch (Throwable t) {
return "Error occured";
}
}
我从未将
toString()
方法调用放在try-catch
块中。但现在当我考虑它时,它可能是有意义的。例如,有人可以覆盖其类中可能引发运行时异常的toString()
方法,如NullPointerException
。因此,我们可以尝试捕获异常。但是为什么要扔掉?你认为这有什么意义吗?Throwable
是异常
和错误
的父类。
通常情况下,尝试捕捉错误是个坏主意,因为它被设计为不被捕捉
捕获可丢弃的只是捕获异常的过度实现和适得其反的版本。尽管如此,如果出于某种原因,您创建了另一种类型的可丢弃文件
,您希望捕获一个异常
,那么这可能是在单个try/catch块中实现这一点的一种方法。这并不是说这是一个干净的方式,但它会起作用
为TL编辑;DR:在大多数情况下,catchException
而不是Throwable
Throwable
是Exception
和Error
的父类。
通常情况下,尝试捕捉错误是个坏主意,因为它被设计为不被捕捉
捕获可丢弃的只是捕获异常的过度实现和适得其反的版本。尽管如此,如果出于某种原因,您创建了另一种类型的可丢弃文件
,您希望捕获一个异常
,那么这可能是在单个try/catch块中实现这一点的一种方法。这并不是说这是一个干净的方式,但它会起作用
为TL编辑;DR:在大多数情况下,捕获异常
而不是可丢弃
在很少的情况下,您可能希望捕获这样的错误。一般来说,这不是一个好主意,但是在这种情况下,这可能是有意义的,因为这通常用于日志记录/调试目的,而不是由应用程序直接使用
我更喜欢信息量更大的东西,比如
private static String safeToString(Object obj) {
if (obj == null) return null;
try {
return obj.toString();
} catch (Throwable t) {
return obj.getClass() + ".toString() threw " + t;
}
}
e、 g
在很少的情况下,您可能希望捕获这样的错误。一般来说,这不是一个好主意,但是在这种情况下,这可能是有意义的,因为这通常用于日志记录/调试目的,而不是由应用程序直接使用
我更喜欢信息量更大的东西,比如
private static String safeToString(Object obj) {
if (obj == null) return null;
try {
return obj.toString();
} catch (Throwable t) {
return obj.getClass() + ".toString() threw " + t;
}
}
e、 g
捕获任何可丢弃的然后继续执行是不正确的,因为它包括错误
,这意味着是致命的:
从:
Error
是Throwable
的一个子类,表示合理的应用程序不应试图捕捉的严重问题。大多数此类错误都是异常情况。该错误虽然是“正常”情况,但也是error
的一个子类,因为大多数应用程序不应该尝试捕捉它
也就是说,一些错误
是可以恢复的(例如LinkageError
),但其他的则不能
但是捕获异常可能是一个有效的用例,例如,在记录代码时,您不希望仅仅因为调用toString()
失败而中断执行:
private static String safeToString(Object obj) {
try {
return obj == null ? "null" : obj.toString();
} catch (Exception e) {
return "<exception: " + e + ">";
}
}
私有静态字符串safeToString(对象obj){
试一试{
返回obj==null?“null”:obj.toString();
}捕获(例外e){
返回“”;
}
}
捕获任何可丢弃的然后继续执行是不正确的,因为它包含错误
,这意味着是致命的:
从:
Error
是Throwable
的一个子类,表示合理的应用程序不应试图捕捉的严重问题。大多数此类错误都是异常情况。该错误虽然是“正常”情况,但也是error
的一个子类,因为大多数应用程序不应该尝试捕捉它
也就是说,一些错误
是可以恢复的(例如LinkageError
),但其他的则不能
但是捕获异常可能是一个有效的用例,例如,在记录代码时,您不希望仅仅因为调用toString()
失败而中断执行:
private static String safeToString(Object obj) {
try {
return obj == null ? "null" : obj.toString();
} catch (Exception e) {
return "<exception: " + e + ">";
}
}
私有静态字符串safeToString(对象obj){
试一试{
返回obj==null?“null”:obj.toString();
}捕获(例外e){
返回“”;
}
}
这样做几乎没有好的理由。声明没有说允许从该方法抛出异常。任何抛出异常的代码都是坏代码,这种异常需要公开和修复,而不是抑制
在将某个“坏”对象从您无法控制的库转换为字符串的情况下,可以编写catch(RuntimeExcepton e)
,但这样的catch应该附带注释,详细说明为什么需要它,因为在正常情况下不需要它
撇开抛出toString方法的Rogue异常不谈,请注意Java已经有了至少两种“安全”的方法来将可能为空的值转换为字符串:
Objects.toString(obj,null)
String.valueOf(obj)
…因此,我怀疑是否应该存在safeToString方法。这样做几乎没有好的理由。声明没有说允许从该方法抛出异常。任何抛出异常的代码都是坏代码,这种异常需要公开和修复,而不是抑制
在将某个“坏”对象从您无法控制的库转换为字符串的情况下,可能适合编写catch(RuntimeExcepton e)
,但这样的catch应该