theFlashWizard
%Europe/Berlin %697 %2007, 17:44
Errors like Events
Beste developers,
Toen ik het exceptions gedeelte van EAS3 (Essential ActionScript 3.0) doorlas had ik een idee. Nu heb ik wat tijd gehad om deze klein uit te werken en ben ik benieuwd wat jullie van het idee vinden.
Voor informatie.
Essential ActionScript 3.0 beschrijft 3 opties voor het beheren van meerdere errors, opties op basis van precisie (engels: granularity):
Één error subclass om het probleem te beschrijven.
Je kan maar 1 Error onderscheiden.
Één error subclass om het probleem te beschrijven, maar met message meegeef functie.
Hierbij kan je de errors onderscheiden door deze message.
Een error subclass per Error.
Je kan verschillende catch's gebruiken waarbij elke een bepaalde subclass opvangt. Op die manier heb je ook je onderscheiding.
Optie 2 lijkt het makkelijkste, maar omdat je snel typefouten maakt in strings lijkt dit geen nette oplossing.
Optie 3 lijkt het netst, maar een class per error vind ik persoonlijk wat overdreven.
Het idee
Mijn idee was om optie 2 te gebruiken, maar dan constants te gebruiken om errors te onderscheiden (Net zoals bij events).
Niet heel geavanceerd, maar net een hele mooie middenweg tussen optie 2 en 3, tenminste volgens mij dan.
Voorbeeld
Een simpel voorbeeld van mijn idee. Inderdaad het "set pet name" voorbeeld heb ik ook uit EAS3.
PetError class
De Error subclass die de type events beschrijft in constants. (Net zoals MouseEvent bijv.)
package {
public class PetError extends Error{
static public const NAME_TO_LONG:String = "nameToLong";
static public const NAME_TO_SHORT:String = "nameToShort";
static public const NO_NAME:String = "noName";
public function PetError(message:String):void{
super(message);
}
}
}
Pet class
De Pet class met een name property die wanneer nodig een error throws.
package {
public class Pet{
static private var maxNameLength:Number = 5;
static private var minNameLength:Number = 2;
private var _name:String;
public function Pet():void{
}
public function get name():String{
return this._name;
}
public function set name(newName:String):void{
if(newName == ""){
throw new PetError(PetError.NO_NAME);
}else if(newName.length > Pet.maxNameLength){
throw new PetError(PetError.NAME_TO_LONG);
}else if(newName.length < Pet.minNameLength){
throw new PetError(PetError.NAME_TO_SHORT);
}
this._name = newName;
}
}
}
ErrorHandling class
De ErrorHandling class die de pet maakt en hem probeert verschillende namen te geven.
(Eigenlijk hoort er een algemene Error catch bij, maar deze heb ik voor eenvoudigheid weggelaten)
package {
import flash.display.Sprite;
public class ErrorHandling extends Sprite{
private var _pet:Pet
public function ErrorHandling():void{
addPet();
setPetName("Mister Lion");
setPetName("Lion");
setPetName("L");
setPetName("");
}
public function addPet(){
this._pet = new Pet();
}
private function setPetName(petName:String):void{
trace("")
trace("setPetName: "+petName)
try{
this._pet.name = petName;
}catch(error:PetError){
trace("An Pet error occorred:");
switch (error.message){
case PetError.NO_NAME:
trace(" No name specified.");
break;
case PetError.NAME_TO_LONG:
trace(" The name is too long.");
break;
case PetError.NAME_TO_SHORT:
trace(" The name is too short.");
break;
}
}
trace("New pet name: "+this._pet.name);
}
}
}
Output
Het resultaat van alle traces:
setPetName: Mister Lion
An Pet error occorred:
The name is too long.
New pet name: null
setPetName: Lion
New pet name: Lion
setPetName: L
An Pet error occorred:
The name is too short.
New pet name: Lion
setPetName:
An Pet error occorred:
No name specified.
New pet name: Lion
Description
In dit systeem zou je ook makkelijk een description systeem kunnen maken.
Weer een klein voorbeeld:
PetError class
package {
public class PetError extends Error{
static public const NAME_TO_LONG:String = "nameToLong";
static public const NAME_TO_SHORT:String = "nameToShort";
static public const NO_NAME:String = "noName";
public var description:String;
public function PetError(message:String):void{
switch (message){
case PetError.NO_NAME:
description = "No name specified.";
break;
case PetError.NAME_TO_LONG:
description = "The name is too long.";
break;
case PetError.NAME_TO_SHORT:
description = "The name is too short.";
break;
}
super(message);
}
}
}
ErrorHandling class
(Eigenlijk is de switch, in mijn voorbeeld, overbodig, maar je wilt niet voor niks errors onderscheiden, dus heb ik het zo gelaten.)
package {
import flash.display.Sprite;
public class ErrorHandling extends Sprite{
private var _pet:Pet
public function ErrorHandling():void{
addPet();
setPetName("Mister Lion");
setPetName("Lion");
setPetName("L");
setPetName("");
}
public function addPet(){
this._pet = new Pet();
}
private function setPetName(petName:String):void{
trace("")
trace("setPetName: "+petName)
try{
this._pet.name = petName;
}catch(error:PetError){
trace("An Pet error occorred:");
switch (error.message){
case PetError.NO_NAME:
trace(" "+error.description);
break;
case PetError.NAME_TO_LONG:
trace(" "+error.description);
break;
case PetError.NAME_TO_SHORT:
trace(" "+error.description);
break;
}
}
trace("New pet name: "+this._pet.name);
}
}
}
Hierdoor heb je als maker van de Pet class de mogelijkheid kant en klare descriptions mee te leveren.
Dus?
Dus wat vinden jullie van deze ideeën?
Alvast bedankt voor jullie mening
Beste developers,
Toen ik het exceptions gedeelte van EAS3 (Essential ActionScript 3.0) doorlas had ik een idee. Nu heb ik wat tijd gehad om deze klein uit te werken en ben ik benieuwd wat jullie van het idee vinden.
Voor informatie.
Essential ActionScript 3.0 beschrijft 3 opties voor het beheren van meerdere errors, opties op basis van precisie (engels: granularity):
Één error subclass om het probleem te beschrijven.
Je kan maar 1 Error onderscheiden.
Één error subclass om het probleem te beschrijven, maar met message meegeef functie.
Hierbij kan je de errors onderscheiden door deze message.
Een error subclass per Error.
Je kan verschillende catch's gebruiken waarbij elke een bepaalde subclass opvangt. Op die manier heb je ook je onderscheiding.
Optie 2 lijkt het makkelijkste, maar omdat je snel typefouten maakt in strings lijkt dit geen nette oplossing.
Optie 3 lijkt het netst, maar een class per error vind ik persoonlijk wat overdreven.
Het idee
Mijn idee was om optie 2 te gebruiken, maar dan constants te gebruiken om errors te onderscheiden (Net zoals bij events).
Niet heel geavanceerd, maar net een hele mooie middenweg tussen optie 2 en 3, tenminste volgens mij dan.
Voorbeeld
Een simpel voorbeeld van mijn idee. Inderdaad het "set pet name" voorbeeld heb ik ook uit EAS3.
PetError class
De Error subclass die de type events beschrijft in constants. (Net zoals MouseEvent bijv.)
package {
public class PetError extends Error{
static public const NAME_TO_LONG:String = "nameToLong";
static public const NAME_TO_SHORT:String = "nameToShort";
static public const NO_NAME:String = "noName";
public function PetError(message:String):void{
super(message);
}
}
}
Pet class
De Pet class met een name property die wanneer nodig een error throws.
package {
public class Pet{
static private var maxNameLength:Number = 5;
static private var minNameLength:Number = 2;
private var _name:String;
public function Pet():void{
}
public function get name():String{
return this._name;
}
public function set name(newName:String):void{
if(newName == ""){
throw new PetError(PetError.NO_NAME);
}else if(newName.length > Pet.maxNameLength){
throw new PetError(PetError.NAME_TO_LONG);
}else if(newName.length < Pet.minNameLength){
throw new PetError(PetError.NAME_TO_SHORT);
}
this._name = newName;
}
}
}
ErrorHandling class
De ErrorHandling class die de pet maakt en hem probeert verschillende namen te geven.
(Eigenlijk hoort er een algemene Error catch bij, maar deze heb ik voor eenvoudigheid weggelaten)
package {
import flash.display.Sprite;
public class ErrorHandling extends Sprite{
private var _pet:Pet
public function ErrorHandling():void{
addPet();
setPetName("Mister Lion");
setPetName("Lion");
setPetName("L");
setPetName("");
}
public function addPet(){
this._pet = new Pet();
}
private function setPetName(petName:String):void{
trace("")
trace("setPetName: "+petName)
try{
this._pet.name = petName;
}catch(error:PetError){
trace("An Pet error occorred:");
switch (error.message){
case PetError.NO_NAME:
trace(" No name specified.");
break;
case PetError.NAME_TO_LONG:
trace(" The name is too long.");
break;
case PetError.NAME_TO_SHORT:
trace(" The name is too short.");
break;
}
}
trace("New pet name: "+this._pet.name);
}
}
}
Output
Het resultaat van alle traces:
setPetName: Mister Lion
An Pet error occorred:
The name is too long.
New pet name: null
setPetName: Lion
New pet name: Lion
setPetName: L
An Pet error occorred:
The name is too short.
New pet name: Lion
setPetName:
An Pet error occorred:
No name specified.
New pet name: Lion
Description
In dit systeem zou je ook makkelijk een description systeem kunnen maken.
Weer een klein voorbeeld:
PetError class
package {
public class PetError extends Error{
static public const NAME_TO_LONG:String = "nameToLong";
static public const NAME_TO_SHORT:String = "nameToShort";
static public const NO_NAME:String = "noName";
public var description:String;
public function PetError(message:String):void{
switch (message){
case PetError.NO_NAME:
description = "No name specified.";
break;
case PetError.NAME_TO_LONG:
description = "The name is too long.";
break;
case PetError.NAME_TO_SHORT:
description = "The name is too short.";
break;
}
super(message);
}
}
}
ErrorHandling class
(Eigenlijk is de switch, in mijn voorbeeld, overbodig, maar je wilt niet voor niks errors onderscheiden, dus heb ik het zo gelaten.)
package {
import flash.display.Sprite;
public class ErrorHandling extends Sprite{
private var _pet:Pet
public function ErrorHandling():void{
addPet();
setPetName("Mister Lion");
setPetName("Lion");
setPetName("L");
setPetName("");
}
public function addPet(){
this._pet = new Pet();
}
private function setPetName(petName:String):void{
trace("")
trace("setPetName: "+petName)
try{
this._pet.name = petName;
}catch(error:PetError){
trace("An Pet error occorred:");
switch (error.message){
case PetError.NO_NAME:
trace(" "+error.description);
break;
case PetError.NAME_TO_LONG:
trace(" "+error.description);
break;
case PetError.NAME_TO_SHORT:
trace(" "+error.description);
break;
}
}
trace("New pet name: "+this._pet.name);
}
}
}
Hierdoor heb je als maker van de Pet class de mogelijkheid kant en klare descriptions mee te leveren.
Dus?
Dus wat vinden jullie van deze ideeën?
Alvast bedankt voor jullie mening