Flex Debug – Obtenir la StackTrace (pile d'appels) n'importe où dans votre code
Lorsque vous rentrez en debug avec Flex Builder et que vous mettez un point d'arrêt, vous pouvez visualiser la "stack trace", c'est-à-dire la pile d'appels.
Pour faire simple, on vous indique quelle méthodes ont été appelées pour en arriver à votre point d'arrêt:
C'est extrêmement pratique pour débugger puisque vous pouvez naviguer dans cette pile et voir par exemple, la valeur d'une variable dans la méthode appelante. Cette vision n'est disponible qu'en mode debug et je ne pensais pas que l'on puisse faire un trace() de la pile d'appel courante sans être en debug dans Flex Builder.
Attention, à ne faire que pour du debug, pas en environnement de production (voir commentaire). Sinon, utilisez "if (Capabilities.isDebugger)" pour n'afficher cette stack trace que dans certaines conditions
Et pourtant, ce blog vient de montrer une "petite feinte" permettant d'obtenir la stack trace dans votre log.
Debug Actionscript Better with getStackTrace + Trace trick
Ils profitent du faire que lorsque l'on a un objet de type Error en ActionScript, on peut obtenir la stack trace qui a amené cette erreur par myError.getStackTrace().
Il suffit alors de créer un objet Error bidon (sans la lancer) et de faire un trace() de sa stack trace:
var er:Error =new Error("BREAK"); //creating but not throwing the error
trace(er.getStackTrace()); // see where the issue is happening, but continue running normally!
Voici ce que cela donne pour l'exemple que j'ai fait un peu plus haut:
Error: BREAK at com.bg.manager.queue::QueueLoadingManager/startLoading()[F:\Workspaces\Flex\Flex_4.3\BGISWebFlexV3\src\com\bg\manager\queue\QueueLoadingManager.as:40] at BGISweb/init()[F:\Workspaces\Flex\Flex_4.3\BGISWebFlexV3\src\script\BGISweb.as:62] at BGISweb/___BGISweb_Application1_applicationComplete()[F:\Workspaces\Flex\Flex_4.3\BGISWebFlexV3\src\BGISweb.mxml:4] at flash.events::EventDispatcher/dispatchEventFunction() at flash.events::EventDispatcher/dispatchEvent() at mx.core::UIComponent/dispatchEvent()[C:\autobuild\3.2.0\frameworks\projects\framework\src\mx\core\UIComponent.as:9298] at mx.managers::SystemManager/preloader_preloaderDoneHandler()[C:\autobuild\3.2.0\frameworks\projects\framework\src\mx\managers\SystemManager.as:2985] at flash.events::EventDispatcher/dispatchEventFunction()
Voilà, cela peut être pratique pour du debug à distance ou pour perfectionner un debug conditionnel. Notez que dans la stack trace, vous obtenez bien les numéros de ligne pour identifier plus facilement l'origine des appels.
Flex Error – ArgumentError: Error #1063: Argument count mismatch on mx.core::CrossDomainRSLItem(). Expected 5, got 6 [Résolu]
Voici une erreur que vous pourrez rencontrer si vous travaillez à plusieurs sur des projets Flex ou si vous utilisez des librairies SWC que vous téléchargés sur le web. Cela s'est produit avec un utilisateur de ma librairie, la DataFilterLib que l'on a finalement résolu.
Cette erreur apparaît à l'exécution, vous la verrez apparaître si vous avez le Flash Player Debugger. Si vous ne l'avez pas, l'erreur va se faire de manière silencieuse et vous n'aurez rien à l'écran. Voici l'erreur que vous pouvez avoir:
ArgumentError: Error #1063: Argument count mismatch on mx.core::CrossDomainRSLItem(). Expected 5, got 6
Le descriptif de cette erreur semble impliquer une erreur au niveau de votre code, pour lequel le nombre d'arguments passés à la méthode CrossDomainRSLItem. Cependant, vous n'avez surement même pas utilisé cette méthode dans votre code. Le problème vient en fait d'un problème avec les librairies que vous utilisez. En effet, cette erreur se produit si vous utilisez des versions du Flex SDK différentes de celles utilisées pour compiler la librairie SWC.
Par exemple, prenons un développeur qui utilise un projet Flex Library et exporte un SWC avec un compilateur Flex 3.2. Vous tentez ensuite d'utiliser ce SWC dans un projet Flex ayant une version type 3.0 ou 3.4. A ce moment-à, il y a un conflit au niveau des RSLs. Pour résoudre ce conflit, accordez vos espaces de travail pour que tout le monde compile ses projets avec la même version du SDK Flex (la plus à jour).
Si vous utilisez une librairie SWC externe, vous devrez obtenir les sources du projet (avec SVN par exemple pour les projets hébergés sous Google Code). Si vous ne pouvez pas avoir les sources, arrangez vous pour être au point avec leur version du SDK.
Flex Modules – Utiliser l'évènement Error (ModuleEvent.ERROR)
L'évènement "error" (ModuleEvent.ERROR) vous donne la possibilité de signaler à l'utilisateur quand un module n'a pas pu être chargé pour une certaine raison (mauvaise URL, problème de sécurité, ...).
Dans l'exemple suivant, vous pouvez charger et décharger un module en utilisant les boutons correspondant. Pour déclencher un évènement error, modifier l'URL dans le composant TextInput vers l'URL d'un module qui n'existe pas. Le handler de l'évènement error va afficher un message à l'utilisateur et écrire le message d'erreur dans le trace log:
Le code de l'application
<?xml version="1.0"?>
<!-- modules/ErrorEventHandler.mxml -->
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"
viewSourceURL="srcview/index.html">
<mx:Script>
<![CDATA[
import mx.events.ModuleEvent;
import mx.modules.*;
import mx.controls.Alert;
private function errorHandler(e:ModuleEvent):void {
Alert.show("Une error s'est produite pendant le chargement du module:" + e.errorText);
trace(e.errorText);
}
public function createModule():void {
if (chartModuleLoader.url == ti1.text) {
// If they are the same, call loadModule.
chartModuleLoader.loadModule();
} else {
// If they are not the same, then change the url,
// which triggers a call to the loadModule() method.
chartModuleLoader.url = ti1.text;
}
}
public function removeModule():void {
chartModuleLoader.unloadModule();
}
]]>
</mx:Script>
<mx:Panel title="Module Example"
height="90%"
width="90%"
paddingTop="10"
paddingLeft="10"
paddingRight="10"
paddingBottom="10">
<mx:HBox>
<mx:Label text="URL:"/>
<mx:TextInput width="200"
id="ti1"
text="http://www.flex-tutorial.fr/wp-content/uploads/ModuleErrorEvent/modules/insurancemodules/AutoInsurance.swf"/>
<mx:Button label="Load"
click="createModule()"/>
<mx:Button label="Unload"
click="removeModule()"/>
</mx:HBox>
<mx:ModuleLoader id="chartModuleLoader"
error="errorHandler(event)"/>
</mx:Panel>
</mx:Application>
L'application en ligne
Flex Source Code Download: Télécharger le code source complet de l'application






