我正在尝试创建代码,如果找到应用程序错误,则抛出异常。我的想法是,我还可以获得发生错误的行号。
我现在拥有的内容如下:
try {
// ...
if ( customerid <= 0 ) throw new ApplicationError( " =>invalid customerid passed in" );
// ...
}
catch ( ApplicationError e )
{
throw new RuntimeError(" => CLASS : "
+ this.getClass().getSimpleName() + " => LINE : "
+ Thread.currentThread().getStackTrace()[1]
+ " => MESSAGE : " + e.getMessage()
+ " => CAUSED BY : " + e.getCause());
}
正如笔记一样,我创建了一个名为RuntimeError的异常,其唯一目的是打印找到的任何错误消息。
但......
问题是在代码中,
部分:Thread.currentThread().getStackTrace()[1]
返回代码Thread.currentThread().getStackTrace()[1]
所在的行号。
投放新ApplicationError( " =>invalid customer passed in );
的行号不在
我尝试过使用:
Thread.currentThread().getStackTrace()[0] and
Thread.currentThread().getStackTrace()[2]
但这些都没有奏效。 Java 1.7现在正在使用 - 但是我的想法是稍后转向1.8。
如何解决这个问题?
更新
根据@ Jean-BaptisteYunès的要求删除我已经解决了第二个问题。
答案 0 :(得分:3)
这里有一些问题。首先,不要将异常命名为错误。 Error
表示事情真的错误,例如服务器着火(或OutOfMemoryError
)。 <{1}}可以使用和扩展。
其次,更重要的是,您实际上通过从堆栈跟踪中删除大部分信息来使自己更难调试异常。如果您在软件中遇到问题,则希望看到整个调用堆栈,而不仅仅是发生异常的最低点。因此,您根本不应该捕获RuntimeException
(您只是用其他异常替换它),而是向上传播它。如果ApplicationError
是一个已检查的异常(在这种情况下它被误导命名)并且您不想将其转换为未经检查的异常,那么您应该只做
ApplicationError
答案 1 :(得分:1)
Thread.currentThread().getStackTrace()
捕获当前指令的堆栈跟踪...如果要获取在e
中捕获的异常的堆栈跟踪,请使用e.getStackTrace()
。
正如@kayaman所说,不要使用错误......