code: private void reportExceptionMismatch(Method method, Set<JavaClass> expectedExceptions, Set<JavaClass> actualExceptions, boolean checkByDirectionally,
              BugType bugType) {
          try {
              for (JavaClass declEx : actualExceptions) {
                  boolean handled = false;
                  for (JavaClass annotEx : expectedExceptions) {
                      if (declEx.instanceOf(annotEx) || (checkByDirectionally && annotEx.instanceOf(declEx))) {
                          handled = true;
                          break;
                      }
                  }
  
                  if (!handled && !expectedExceptions.contains(declEx)) {
                      bugReporter.reportBug(new BugInstance(this, bugType.name(), NORMAL_PRIORITY).addClass(this).addMethod(cls, method)
                              .addString("Exception: " + declEx.getClassName()));
                  }
              }
          } catch (ClassNotFoundException cnfe) {
              bugReporter.reportMissingClass(cnfe);
          }
      }
docs: compares the current methods exceptions to those declared in the spring-tx's @Transactional method, both rollbackFor and noRollbackFor. It looks both
  ways, exceptions thrown that aren't handled by rollbacks/norollbacks, and Spring declarations that aren't actually thrown.
  
  @param method
  the currently parsed method
  @param expectedExceptions
  exceptions declared in the @Transactional annotation
  @param actualExceptions
  non-runtime exceptions that are thrown by the method
  @param checkByDirectionally
  whether to check both ways
  @param bugType
  what type of bug to report if found