如何查看给定方法中抛出的运行时异常?
How can I see the runtime exceptions thrown within a given method?
我有一个调用其他几个方法的方法。然而,这些方法和其他操作(如导航数组或使用空指针)可能会抛出不明确的运行时异常。
可以使用 try{...}catch(Exception e){...} 块来确保没有异常异常越过障碍和我的方法不会抛出任何未在其签名中明确声明的异常。
但是这个解决方案很丑陋并且容易出现错误,因为我可能不想捕获所有内容,或者我可能想在特定错误情况下提供一些特定行为。
那么,Eclipse 有没有办法向我显示类似 "careful, your method says that it throws IllegalArgumentException and JSONException, but you are missing some runtime exceptions that you can catch internally or declare that you throw them as well" 的内容?到目前为止,Eclipse 只向我展示了哪些异常是我必须在方法签名中声明的,但我也想被迫声明(未经检查的)运行时异常。
Ps.: 这不是 How can I know what exceptions can be thrown from a method? 的副本,因为最好的解决方案是使用 catch-all 块。
简短的回答是:你不能。
这就是RuntimeException的本质;他们不是 "checked" 例外;因此,您不会被强制将它们添加到您的 throws 子句中。
重要的是,在某种程度上,您的代码了解可能会发生 RuntimeExceptions;并以正确的方式对待他们。
示例:假设您正在处理 "providers",它应该处理来自 restful API 的请求。
现在有两类问题:
A) 您 "expect" 以及您提供精细反馈的那些。例如,您的 API 规范可能会列出许多 400.xxx、409.xxx、...各种问题的答案。对这些事情使用 "checked" 异常是有意义的(抛出 "ApiException" 的代码已经知道这个错误应该显示为 409.xxx 给 restful API).
B) 还有那些你 "do not expect";基本上那些在你的代码中反映了 "bugs" ;喜欢 "he, this argument should not be null"; "he, this 'key' is unknown"。对于那些...只需抛出 RuntimeExceptions。 但是 确保你的顶层能捕捉到它们;例如将它们变成 500.xxx 对用户的回答(“发生了一些内部错误,这是堆栈跟踪;向我们发送错误报告)
您的请求有一个有趣的转折。您想要捕获被调用方法可能抛出的 所有 异常,但您不想使用 catch(Exception ex){ … }
因为这意味着......您正在捕获 所有 个异常。
让我们反过来问:您想从 catch 子句中排除 哪个异常?如果您想捕获所有已检查的异常以及所有运行时异常,则排除 Error
s 和那些可能 不会 发生的运行时异常。嗯,这就是 catch(Exception ex){ … }
已经在做的事情。它不会捕获 Error
s 并且您无需为不可能发生的异常而烦恼。
也就是说,您不应该赶上 RuntimeException
是有原因的。它们用于指示通常不应发生的情况,即使在编译时无法证明它们的可能性。
如果您希望 IDE 收集原则上可能的所有运行时异常,请考虑
- 每次访问对象或数组都可能导致
NullPointerException
- 每次数组访问都可能导致
ArrayIndexOutOfBoundsException
或 NegativeArraySizeException
- 每次数组写访问都可能导致
ArrayStoreException
- 每个整数除法都可能导致
ArithmeticException
- 每个运行时类型转换,包括被泛型隐藏的类型转换都可能产生
ClassCastException
等这些只是与语言构造相关的异常,不包含库方法可能产生的异常。
如果您真的要求工具为特定代码段和所有调用的方法收集所有异常,那么可能的异常集很快就会激增。
您的 catch 子句中需要一个非常大的异常类型列表,这只是为了隐藏您实际上正在尝试捕获所有异常的事实(因为 catch(Exception ex)
会立即显现出来)...
我有一个调用其他几个方法的方法。然而,这些方法和其他操作(如导航数组或使用空指针)可能会抛出不明确的运行时异常。
可以使用 try{...}catch(Exception e){...} 块来确保没有异常异常越过障碍和我的方法不会抛出任何未在其签名中明确声明的异常。
但是这个解决方案很丑陋并且容易出现错误,因为我可能不想捕获所有内容,或者我可能想在特定错误情况下提供一些特定行为。
那么,Eclipse 有没有办法向我显示类似 "careful, your method says that it throws IllegalArgumentException and JSONException, but you are missing some runtime exceptions that you can catch internally or declare that you throw them as well" 的内容?到目前为止,Eclipse 只向我展示了哪些异常是我必须在方法签名中声明的,但我也想被迫声明(未经检查的)运行时异常。
Ps.: 这不是 How can I know what exceptions can be thrown from a method? 的副本,因为最好的解决方案是使用 catch-all 块。
简短的回答是:你不能。
这就是RuntimeException的本质;他们不是 "checked" 例外;因此,您不会被强制将它们添加到您的 throws 子句中。
重要的是,在某种程度上,您的代码了解可能会发生 RuntimeExceptions;并以正确的方式对待他们。
示例:假设您正在处理 "providers",它应该处理来自 restful API 的请求。
现在有两类问题:
A) 您 "expect" 以及您提供精细反馈的那些。例如,您的 API 规范可能会列出许多 400.xxx、409.xxx、...各种问题的答案。对这些事情使用 "checked" 异常是有意义的(抛出 "ApiException" 的代码已经知道这个错误应该显示为 409.xxx 给 restful API).
B) 还有那些你 "do not expect";基本上那些在你的代码中反映了 "bugs" ;喜欢 "he, this argument should not be null"; "he, this 'key' is unknown"。对于那些...只需抛出 RuntimeExceptions。 但是 确保你的顶层能捕捉到它们;例如将它们变成 500.xxx 对用户的回答(“发生了一些内部错误,这是堆栈跟踪;向我们发送错误报告)
您的请求有一个有趣的转折。您想要捕获被调用方法可能抛出的 所有 异常,但您不想使用 catch(Exception ex){ … }
因为这意味着......您正在捕获 所有 个异常。
让我们反过来问:您想从 catch 子句中排除 哪个异常?如果您想捕获所有已检查的异常以及所有运行时异常,则排除 Error
s 和那些可能 不会 发生的运行时异常。嗯,这就是 catch(Exception ex){ … }
已经在做的事情。它不会捕获 Error
s 并且您无需为不可能发生的异常而烦恼。
也就是说,您不应该赶上 RuntimeException
是有原因的。它们用于指示通常不应发生的情况,即使在编译时无法证明它们的可能性。
如果您希望 IDE 收集原则上可能的所有运行时异常,请考虑
- 每次访问对象或数组都可能导致
NullPointerException
- 每次数组访问都可能导致
ArrayIndexOutOfBoundsException
或NegativeArraySizeException
- 每次数组写访问都可能导致
ArrayStoreException
- 每个整数除法都可能导致
ArithmeticException
- 每个运行时类型转换,包括被泛型隐藏的类型转换都可能产生
ClassCastException
等这些只是与语言构造相关的异常,不包含库方法可能产生的异常。
如果您真的要求工具为特定代码段和所有调用的方法收集所有异常,那么可能的异常集很快就会激增。
您的 catch 子句中需要一个非常大的异常类型列表,这只是为了隐藏您实际上正在尝试捕获所有异常的事实(因为 catch(Exception ex)
会立即显现出来)...