docs: public Location getExceptionThrowerLocation(Edge exceptionEdge) {
          if (!exceptionEdge.isExceptionEdge()) {
              throw new IllegalArgumentException();
          }
  
          InstructionHandle handle = exceptionEdge.getSource().getExceptionThrower();
          if (handle == null) {
              throw new IllegalStateException();
          }
  
          BasicBlock basicBlock = (handle.getInstruction() instanceof ATHROW) ? exceptionEdge.getSource()
                  : getSuccessorWithEdgeType(exceptionEdge.getSource(), EdgeTypes.FALL_THROUGH_EDGE);
  
          if (basicBlock == null && removedEdgeList != null) {
              // The fall-through edge might have been removed during
              // CFG pruning. Look for it in the removed edge list.
              for (Edge removedEdge : removedEdgeList) {
                  if (removedEdge.getType() == EdgeTypes.FALL_THROUGH_EDGE
                          && removedEdge.getSource() == exceptionEdge.getSource()) {
                      basicBlock = removedEdge.getTarget();
                      break;
                  }
              }
          }
  
          if (basicBlock == null) {
              throw new IllegalStateException("No basic block for thrower " + handle + " in " + this.methodGen.getClassName() + "."
                      + this.methodName + " : " + this.methodGen.getSignature());
          }
  
          return new Location(handle, basicBlock);
      }