@Override
    public void execute() {
        Logger.getInstance().info("Executing method " + getMethod());

        try {
            rawExecutionResult = Arietta.rpc.callMethod(getMethod(), getParams());

            if (rawExecutionResult == null) {
                Logger.getInstance().error("Got null result for " + getMethod());
                throw new InvalidResponseException("Got null result");
            }

            Logger.getInstance().debug("Got result for " + getMethod());

            runInNewThread(new Runnable() {
                @Override
                public void run() {
                    try {
                        handleResult();
                    } catch (InvalidRpcDataException e) {
                        Arietta.handleRemoteException(e);
                    }
                }
            });

        } catch (InvalidResponseException e) {
            Arietta.handleRemoteException(e);
        } catch (ConnectionLostException e) {
            Arietta.handleConnectException(e);
        }

        /**
         * If handleResult here will add another task to queue, RPC thread may
         * be deadlocked by itself, so let's run this method in EventQueue
         * thread.
         * 
         * EventQueue.invokeLater(new Runnable() {
         * 
         * @Override public void run() { try { handleResult(rawExecutionResult);
         *           } catch (ClassCastException e) {
         *           Arietta.handleException(e); } } });
         */
    }