replace RuntimeException with GameException in cases where game object is available for more informative exception reports

master
melvinzhang 2015-11-10 09:51:57 +08:00
parent a7604a93fe
commit 5263fc07f8
9 changed files with 24 additions and 10 deletions

View File

@ -7,6 +7,11 @@ public class GameException extends RuntimeException {
final MagicGame game;
public GameException(final String desc, final MagicGame aGame) {
super(desc);
game = aGame;
}
public GameException(final Throwable cause, final MagicGame aGame) {
super(cause);
game = aGame;

View File

@ -8,6 +8,8 @@ import magic.model.target.MagicTargetFilter;
import magic.model.target.MagicTargetType;
import magic.model.stack.MagicItemOnStack;
import magic.model.stack.MagicCardOnStack;
import magic.exception.GameException;
import java.util.Collection;
import java.util.EnumMap;
import java.util.LinkedList;
@ -138,7 +140,7 @@ public class MagicCard
card = mappedOwner.getLibrary().getCard(id);
}
if (card == MagicCard.NONE) {
throw new RuntimeException("Mapping card failed, card " + getName() + " " + id + " not found");
throw new GameException("Mapping card failed, card " + getName() + " " + id + " not found", game);
}
return card;
}

View File

@ -6,6 +6,7 @@ import magic.model.MagicRandom;
import magic.model.MagicSource;
import magic.model.event.MagicEvent;
import magic.exception.UndoClickedException;
import magic.exception.GameException;
import java.util.ArrayList;
import java.util.Collection;
@ -85,7 +86,7 @@ public abstract class MagicChoice {
final Collection<?> options=getArtificialOptions(game,event);
final int size=options.size();
if (size == 0) {
throw new RuntimeException("no artificial choice result for " + event);
throw new GameException("no artificial choice result for " + event, game);
} else if (size == 1) {
return Collections.singletonList(new Object[]{options.iterator().next()});
} else {
@ -102,7 +103,7 @@ public abstract class MagicChoice {
final List<Object[]> choices = getArtificialChoiceResults(game, event);
final int size = choices.size();
if (size == 0) {
throw new RuntimeException("no simulation choice result");
throw new GameException("no simulation choice result", game);
}
return choices.get(MagicRandom.nextRNGInt(choices.size()));
}

View File

@ -5,6 +5,7 @@ import magic.model.MagicAbility;
import magic.model.MagicGame;
import magic.model.MagicPermanent;
import magic.model.MagicPlayer;
import magic.exception.GameException;
/** Creature permanent or player. Can be your own creatures. */
public class MagicDamageTargetPicker extends MagicTargetPicker<MagicTarget> {
@ -55,7 +56,7 @@ public class MagicDamageTargetPicker extends MagicTargetPicker<MagicTarget> {
final int score=leftToughness<=0?permanent.getScore():20-leftToughness;
return permanent.getController()==player?-score:score;
} else {
throw new RuntimeException("target is neither MagicPlayer nor MagicPermanent");
throw new GameException("target is neither MagicPlayer nor MagicPermanent", game);
}
}
}

View File

@ -4,6 +4,7 @@ import magic.model.MagicGame;
import magic.model.MagicPermanent;
import magic.model.event.MagicEvent;
import magic.model.target.MagicTargetFilter;
import magic.exception.GameException;
public abstract class MagicCannotBeBlockedTrigger extends MagicTrigger<MagicPermanent> {
public MagicCannotBeBlockedTrigger(final int priority) {
@ -24,7 +25,7 @@ public abstract class MagicCannotBeBlockedTrigger extends MagicTrigger<MagicPerm
}
@Override
public MagicEvent executeTrigger(final MagicGame game,final MagicPermanent permanent, final MagicPermanent other) {
throw new RuntimeException(getClass() + " does not have an executeTrigger method");
throw new GameException(getClass() + " does not have an executeTrigger method", game);
}
};
}
@ -37,7 +38,7 @@ public abstract class MagicCannotBeBlockedTrigger extends MagicTrigger<MagicPerm
}
@Override
public MagicEvent executeTrigger(final MagicGame game,final MagicPermanent permanent, final MagicPermanent other) {
throw new RuntimeException(getClass() + " does not have an executeTrigger method");
throw new GameException(getClass() + " does not have an executeTrigger method", game);
}
};
}

View File

@ -4,6 +4,7 @@ import magic.model.MagicGame;
import magic.model.MagicPermanent;
import magic.model.event.MagicEvent;
import magic.model.target.MagicTargetFilter;
import magic.exception.GameException;
public abstract class MagicCantBlockTrigger extends MagicTrigger<MagicPermanent> {
public MagicCantBlockTrigger(final int priority) {
@ -24,7 +25,7 @@ public abstract class MagicCantBlockTrigger extends MagicTrigger<MagicPermanent>
}
@Override
public MagicEvent executeTrigger(final MagicGame game,final MagicPermanent permanent, final MagicPermanent other) {
throw new RuntimeException(getClass() + " does not have an executeTrigger method");
throw new GameException(getClass() + " does not have an executeTrigger method", game);
}
};
}

View File

@ -2,6 +2,7 @@ package magic.model.trigger;
import magic.model.MagicCopyMap;
import magic.model.MagicPermanent;
import magic.exception.GameException;
import java.util.ArrayList;
import java.util.Collection;
@ -76,7 +77,7 @@ public class MagicPermanentTriggerMap {
}
}
}
throw new RuntimeException("Could not remove " + permanent + "'s trigger " + trigger);
throw new GameException("Could not remove " + permanent + "'s trigger " + trigger, permanent.getGame());
}
public void remove(final MagicPermanentTrigger mptrigger) {

View File

@ -4,6 +4,7 @@ import magic.model.MagicGame;
import magic.model.MagicPermanent;
import magic.model.event.MagicEvent;
import magic.model.target.MagicTargetFilter;
import magic.exception.GameException;
public abstract class MagicProtectionTrigger extends MagicTrigger<MagicPermanent> {
public MagicProtectionTrigger(final int priority) {
@ -24,7 +25,7 @@ public abstract class MagicProtectionTrigger extends MagicTrigger<MagicPermanent
}
@Override
public MagicEvent executeTrigger(final MagicGame game,final MagicPermanent permanent, final MagicPermanent other) {
throw new RuntimeException(getClass() + " does not have an executeTrigger method");
throw new GameException(getClass() + " does not have an executeTrigger method", game);
}
};
}

View File

@ -6,6 +6,7 @@ import magic.model.MagicGame;
import magic.model.MagicPermanent;
import magic.model.event.MagicEvent;
import magic.model.event.MagicEventAction;
import magic.exception.GameException;
/** Lower priority values trigger before higher priority values. */
public abstract class MagicTrigger<T> implements MagicEventAction,MagicChangeCardDefinition {
@ -38,7 +39,7 @@ public abstract class MagicTrigger<T> implements MagicEventAction,MagicChangeCar
@Override
public void executeEvent(final MagicGame game, final MagicEvent event) {
throw new RuntimeException(getClass() + " did not override executeEvent");
throw new GameException(getClass() + " did not override executeEvent", game);
}
public abstract MagicTriggerType getType();