如何确定在java中是否从catch块调用了相同的方法?
我有一个方法,例如,如何确定在java中是否从catch块调用了相同的方法?,java,Java,我有一个方法,例如,void abc(){},这个方法直接从我的main()方法以及它的异常块(即catch块)调用 现在,我想在abc()方法中了解abc()是正常调用(即从main())还是在异常情况下调用(即从catch()块) 我使用Thread.getCurrentStackTrace()尝试了这个方法,但是它总是返回main()方法(作为方法名),因为在这两种情况下,方法总是保持不变 这里重要的一点是,我不能更改abc()方法的签名,也不能在main()方法或catch()块中设置任
void abc(){}
,这个方法直接从我的main()
方法以及它的异常块(即catch块)调用
现在,我想在abc()
方法中了解abc()
是正常调用(即从main()
)还是在异常情况下调用(即从catch()
块)
我使用Thread.getCurrentStackTrace()
尝试了这个方法,但是它总是返回main()
方法(作为方法名),因为在这两种情况下,方法总是保持不变
这里重要的一点是,我不能更改abc()方法的签名,也不能在main()方法或catch()块中设置任何标志,有了这些限制,我试图找出,如何检查从哪里调用abc()或简单地说……如何找出abc()方法中是否抛出异常
请建议 您可以将一个布尔参数传递给您的方法,让它知道从何处调用它
public static void abc(boolean isError)
{
if (isError) {
// method was called from catch block
}
}
public static void main (String[] args)
{
try {
...
abc(false);
...
}
catch (Exception exc) {
abc(true);
}
}
我可以想出一些解决办法:
abc()
的附加输入,检测方法调用的位置。如果要在发生错误时更改方法abc的功能,请使用此方法abc
中检查此变量可以向方法中添加字符串参数:
public static void method (String msg)
{
}
public static void someOtherMethod(){
method("calling from someOtherMethod");
}
public static void main (String[] args)
{
try {
method("calling from main");
}
catch (Exception exc) {
method("an exception is thrown" );
}
someOtherMethod(){
}
}
getCurrentStackTrace()显然不起作用,因为无论是从main调用它还是从catch调用它,在这两种情况下线程都将保持不变 除了这些选项之外,首先您可以按照@Eran的建议进行操作,我不会重复这个答案,如果您不想更改方法签名,那么您可以做的另一件事是在从catch block调用abc()之前设置/取消设置布尔变量。。参见下面的示例
private static boolean isCalledFromCatch = false;
public static void method ()
{
if(isCalledFromCatch){
//Catch specific processing here
}else{
//main specific processing here
}
}
public static void main (String[] args)
{
try {
isCalledFromCatch = false;
abc();
}
catch (Exception exc) {
isCalledFromCatch = true;
abc();
}
}
但是,如果一个函数需要从try
和catch
同时调用,最好从finally
块调用它。这样,您就不需要从两个不同的位置调用它。使用,您可以获得行号,从行号可以确定是否从main()
的catch块调用了abc()
。
看见
这与您已经尝试过的方法类似,但您会得到行号
注意:只有当您有main方法的源代码来查看行号时,这才有效。如果main位于源代码不可用的外部jar中,则无法工作
编辑:另外,如果创建外部jar时没有行号调试信息,则此操作将不起作用。添加一些日志语句如何?或者通过调试器检查?谢谢你们的更新。这里的问题是我不能更改void abc()的签名,因为它是框架代码,不允许更改!你为什么要这个?Java中没有任何东西可以识别从
catch
块调用方法,因为从JVM的角度看,在catch
块内部的代码和不在catch
块内部的代码没有区别。不可能。谢谢你们的更新。这里的问题是我不能更改void abc()的签名,因为它是框架代码,不允许更改!如果它是在没有行号调试信息的情况下编译的,它也不会工作。如果在main块上方或main try和catch块之间添加了新的代码行,它会继续工作吗?是的,只要您使用的jar是从您引用的相同源代码创建的,它就会工作。若jar被更新,你们需要参考相应的更新源代码,反之亦然。