【问题标题】:Handle deep exceptions, from inside onClickListener从 onClickListener 内部处理深层异常
【发布时间】:2017-08-29 11:20:43
【问题描述】:

我有一个在某些Button 上定义onClickListener 的方法, 这个方法抛出异常。

  void foo() throws Exception{
                button.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View view) {
                        buttonClicked();
                    }
                });
            }

而且buttonClicked()方法也抛出异常!

  void buttonClicked() throws Exception{
        //some code that can cause exception
   }

我想做的是抓住Exception来自buttonClicked()并将它从foo()扔掉。

所以我应该可以捕捉到Exception 来自buttonClicked()

try
{
    foo();
}
catch (Exception e)
{
    // HERE
}

关于如何做到这一点的任何想法 - 不使用接口。

【问题讨论】:

  • void buttonClicked() { //使用try catch //一些可能导致异常的代码 }
  • 你想从 buttonClicked() 抛出异常并从 foo() 中捕获它还是什么?为什么你试图同时从 foo() 和 buttonClicked() 中抛出它?
  • @Hetfieldan24 是的,这正是我想要做的,从buttonClicked 抛出然后在foo 中再次从foo 抛出。为什么?因为我想在其他地方使用foo方法,需要知道foo的代码是成功还是失败,另外还需要知道buttonClicked的代码是成功还是失败!

标签: java android exception-handling onclicklistener


【解决方案1】:

这就是你想要的?

void foo() throws Exception
{
    button.setOnClickListener(new View.OnClickListener() 
    {
        @Override
        public void onClick(View view) 
        {
            try
            {
                buttonClicked();
            }
            catch (Exception e)
            {
                try
                {
                    throw new Exception("message from buttonClicked(): " + e.getMessage());
                }
                catch (Exception newException)
                {
                    Log.e("CATCHED", newException.getMessage());
                }
            }
        }
    });
}

那么当你打电话给foo():

try
{
    foo();
}
catch (Exception e)
{
    Log.e("CATCHED", "message from foo(): " + e.getMessage());
}

因此,如果foo()中的setOnClickListener()设置成功,但随后Exceptionfoo()捕获,您将在每次点击后收到一次来自foo()的消息和来自buttonClicked()的消息。

【讨论】:

  • 你确定onClickListener()设置成功了吗?您能否发布完整的代码,您是如何导致这两个异常的?
  • 我在发布之前尝试过这个。正如我所说:如果我添加这个: String sdf = null; sdf.getBytes();在 foo() 中的 setOnClickListener() 之后并在 buttonClicked() 中添加相同的代码,所以我会在每次点击后收到来自 foo() 的消息和来自 buttonClicked() 的消息。
  • 是的,我当然不明白。您想在 foo() 捕获块中捕获 buttonClicked() 异常(单击按钮时引发) - 当您调用 foo() 时触发。它们是在不同的时间触发的,所以我认为使用 try-catch 逻辑是不可能的。看来,您应该为此在 foo() 的 catch 块中使用一些侦听器/处理程序。
猜你喜欢
  • 2017-09-22
  • 2013-10-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-11
  • 2019-02-16
  • 2015-06-06
  • 1970-01-01
相关资源
最近更新 更多