List<PsiClassType> (@NotNull PsiTryStatement tryStatement) { List<PsiClassType> array = new ArrayList<>(); PsiResourceList resourceList = tryStatement.getResourceList(); if (resourceList != null) { for (PsiResourceListElement resource : resourceList) { addExceptions(array, getUnhandledCloserExceptions(resource, resourceList)); } } PsiCodeBlock tryBlock = tryStatement.getTryBlock(); if (tryBlock != null) { addExceptions(array, getThrownExceptions(tryBlock)); } for (PsiParameter parameter : tryStatement.getCatchBlockParameters()) { PsiType exception = parameter.getType(); for (int j = array.size() - 1; j >= 0; j--) { PsiClassType exception1 = array.get(j); if (exception.isAssignableFrom(exception1)) { array.remove(exception1); } } } for (PsiCodeBlock catchBlock : tryStatement.getCatchBlocks()) { addExceptions(array, getThrownExceptions(catchBlock)); } PsiCodeBlock finallyBlock = tryStatement.getFinallyBlock(); if (finallyBlock != null) { // if finally block completes normally, exception not caught // if finally block completes abruptly, exception gets lost try { ControlFlow flow = ControlFlowFactory .getInstance(finallyBlock.getProject()).getControlFlow(finallyBlock, LocalsOrMyInstanceFieldsControlFlowPolicy.getInstance(), false); int completionReasons = ControlFlowUtil.getCompletionReasons(flow, 0, flow.getSize()); List<PsiClassType> thrownExceptions = getThrownExceptions(finallyBlock); if (!BitUtil.isSet(completionReasons, ControlFlowUtil.NORMAL_COMPLETION_REASON)) { array = new ArrayList<>(thrownExceptions); } else { addExceptions(array, thrownExceptions); } } catch (AnalysisCanceledException e) { // incomplete code } } return array; }