在引发java异常时获取错误的行号

时间:2017-08-04 10:38:50

标签: java exception-handling

我正在尝试创建代码,如果找到应用程序错误,则抛出异常。我的想法是,我还可以获得发生错误的行号。

我现在拥有的内容如下:

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的要求删除我已经解决了第二个问题。

2 个答案:

答案 0 :(得分:3)

这里有一些问题。首先,不要将异常命名为错误。 Error表示事情真的错误,例如服务器着火(或OutOfMemoryError)。 <{1}}可以使用和扩展。

其次,更重要的是,您实际上通过从堆栈跟踪中删除大部分信息来使自己更难调试异常。如果您在软件中遇到问题,则希望看到整个调用堆栈,而不仅仅是发生异常的最低点。因此,您根本不应该捕获RuntimeException(您只是用其他异常替换它),而是向上传播它。如果ApplicationError是一个已检查的异常(在这种情况下它被误导命名)并且您不想将其转换为未经检查的异常,那么您应该只做

ApplicationError

答案 1 :(得分:1)

Thread.currentThread().getStackTrace()捕获当前指令的堆栈跟踪...如果要获取在e中捕获的异常的堆栈跟踪,请使用e.getStackTrace()

正如@kayaman所说,不要使用错误......