Java Android-在提交之前(期间)检查FragmentManager事务是否存在由片段代码引起的异常

Java Android-在提交之前(期间)检查FragmentManager事务是否存在由片段代码引起的异常,java,android,exception,android-fragments,fragmentmanager,Java,Android,Exception,Android Fragments,Fragmentmanager,我在Android上有一个几乎完全可以工作的模块化动态外部片段加载应用程序 唯一剩下的就是处理异常和错误。可能发生的一个可能性是模块片段代码中的错误,例如调用不存在的方法或平均空指针,这可能发生,也确实发生 当提交fragmentTransaction时,似乎会调用fragmentTransaction基本方法,而不是在调用fragmentTransaction.commit时,这使得异常很难捕获。我可以通过调用getSupportFragmentManager.executePendingTr

我在Android上有一个几乎完全可以工作的模块化动态外部片段加载应用程序

唯一剩下的就是处理异常和错误。可能发生的一个可能性是模块片段代码中的错误,例如调用不存在的方法或平均空指针,这可能发生,也确实发生

当提交fragmentTransaction时,似乎会调用fragmentTransaction基本方法,而不是在调用fragmentTransaction.commit时,这使得异常很难捕获。我可以通过调用getSupportFragmentManager.executePendingTransactions强制捕获异常,如图所示

问题是,提交仍将在某个时刻发生-例如,暂停应用程序会使其保存其状态,从而提交所有挂起的事务,最终导致异常,即代码片段中的错误导致的异常,即使catch块推迟了提交,也不是非法状态异常。以下方法导致此行为

private void showFragment(String name) {
    fragmentTransaction = getSupportFragmentManager().beginTransaction();
    fragmentTransaction.add(R.id.linear_main, fragmentMap.get(name));
    try {
        fragmentTransaction.commit();
        getSupportFragmentManager().executePendingTransactions();
    } catch (Exception e) {
        // Do nothing :)
    }
}
我尝试过各种各样的对策,在不同的时间点都会出现不同的例外情况,但没有一种能正常工作,而是选择了一种似乎最合理的对策,尽管它根本不起作用这就是下面的代码,它实际上显示了一点不同的行为-它立即抛出一个java.lang.IllegalStateException:Recursive条目来执行PendingTransactions,我想这与提交冲突和试图弹出堆栈有关。是的,我不太了解碎片经理的行为

搜索此错误会找到片段内部片段问题的解决方案,这些问题与我的问题完全无关

private void showFragment(String name) {
    fragmentTransaction = getSupportFragmentManager().beginTransaction();
    fragmentTransaction.add(R.id.linear_main, fragmentMap.get(name));
    fragmentTransaction.addToBackStack(null);
    try {
        fragmentTransaction.commit();
        getSupportFragmentManager().executePendingTransactions();
    } catch (Exception e) {
        getSupportFragmentManager().popBackStackImmediate();
        fragmentMap.remove(name);
        Log.e("showFragments", name + " removed", e);
    }
}
所以,基本上我需要检查片段的onCreate和onCreateView等。。。在实际执行fragmentTransaction之前不会导致异常。似乎在提交时玩try-catch并不能达到目的。我只需要停止渲染片段,而不是让整个应用程序崩溃。有什么现成的想法吗

谢谢

编辑:

我意识到,由于上述类型的任何错误都可能在片段运行时的任何地方发生,因此在添加片段时尝试捕捉错误是毫无意义的。哦,愚蠢的我

设置默认的未捕获异常处理程序,这要感谢Jakar为我指明了方向,这有助于通知用户错误是由插件引起的,但是应用程序仍然必须崩溃,因为实际上不可能知道是哪个插件导致了异常并将其删除,或者如果异常在初始化过程中发生,则不可能进行任何删除,但如果异常稍后发生,则应该可以进行删除


因此,这使得我的问题变得无关紧要,尽管能够做到我所描述的事情会很有趣。

最后的结论是,目前这是不可能的。正如我在编辑问题时所说:

我意识到,由于上述任何错误都可能发生 在片段运行时的任何地方,它都是毫无意义的 尝试在添加片段时捕获错误


因此,尝试实现这一点毫无意义。

使用一些段落可以让您的问题更具可读性。从何处调用showFragment方法?文档声明,在调用Activity.onSaveInstanceState之后无法创建/提交事务,除非调用了另一个Activity.onResume/onStart,我猜这就是问题所在。如果使用commitAllowingStateLoss而不是commit可以消除异常,那么我的猜测可能是对的。我想我应该说我已经尝试过了。。。我相信你误解了我的问题,因为这些问题是无关的。异常是由从外部文件加载的片段中的错误引起的,因此可能包含错误。我需要做的是在片段代码中捕获异常,而不是在实际执行提交时发生的提交中,然后不执行它。我开始认为这是不可能的,因为事务无论如何都会排队,捕获异常只能推迟它的执行。是的,我误解了。您可以尝试使用自己的UncaughtExceptionHandler,请参见。我不确定它是否能像你需要的那样工作,但这是我所能想到的。哦,非常感谢,从没想过。我试试看。虽然这有点牵强,可能不是一个合适的方法,但它可能是唯一可能的方法我会试着把它带给我的信息带回来。