Forums : Xul, Xbl, JS...

Aller à la discussion :  Plus récente Plus ancienne

# [Réglé] Exception lancée ?

Envoyé par : Cyrare

Date : 06/10/2004 11:23

Salut à tous ! :)

En essayant d'envoyer des infos à un fichier php, il me lance une exception quand j'essaye d'accéder au résultat du fichier. Mon php est bien lancé, j'en ai la certitude, mais je ne peux avoir de retour...

function add()
{
var httpRequest = new XMLHttpRequest();
var vars = "a=1&b=2";

try
{
	httpRequest.open("POST", "action.php", true);
	httpRequest.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
	httpRequest.setRequestHeader("Content-Length", vars.length);
	httpRequest.send(vars);
	var result = httpRequest.status;
	alert(result);
}
catch (e)
{
	alert("Error:\n" + e);
	return false;
}
}

m'envoie :

[Exception... "Component returned failure code: 0x80040111 (NS_ERROR_NOT_AVAILABLE)
[nsIXMLHttpRequest.status]" nsresult: "0x80040111 (NS_ERROR_NOT_AVAILABLE)" location: "JS frame :: http://www.mysite.com/index.php :: add :: line 30" data: no][/code]

Une idée ? Merci !!

# Re: Exception lancée ?

Envoyé par : Cyrare

Date : 11/10/2004 15:45

Ha oui, heu, je me doute que peu de personnes savent de quoi il en retourne exactement, mais si vous savez dans quelle direction chercher, exemple, si il existe un glossaire des erreurs, ou bien si on peut contacter un support ou autre, ce serait un grand pas en avant pour moi qui suit bloqué là...

Merci beaucoup ! :)

# Re: Exception lancée ?

Envoyé par : David@site

Date : 13/10/2004 16:33

Je crois comprendre ce qui t'arrive, tu as lance une requete http en mode asynchrone (voir open("POST", "action.php", true)). Donc ton script continue sans attendre la reponse a ta requete, et comme la page action.php peut etre un poil lng a charger, ton script arrive a la ligne "var result = httpRequest.status;" sans avoir encore de reponse.

il y a 2 solutions: 1) la facile, tu lance une requete Http en mode synchrone: la seule ligne a change est httpRequest.open("POST", "action.php", false); inconvenient: Si ta page php est longue a charge (ou si tu perd ta connexion internet pendant ce temps par exemple) ton script risque d'attendre longtemps... 2)La solution plus elegante: tu continue ta requete en mode asynchrone (comme ca pas de risque de plantage du script si php long a charger) et tu met un evenement en ecoute sur le chargement de ta page, comme ca des qu'elle est charge tu lance une fonction: exemple:

var httpRequest;
function add()
{
var vars = "a=1&b=2";
httpRequest = new XMLHttpRequest();
httpRequest.onreadystatechange = montreresults;
httpRequest.open("POST", "action.php", true);
httpRequest.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
httpRequest.setRequestHeader("Content-Length", vars.length);
httpRequest.send(vars);
}
function montreresults()
{
if(httpRequest.readyState == 4) //4==document completement charge; 1==en cours; 2==charge; 3==interactif 0==initialise
 {
 var result = httpRequest.status;
 alert(result);
 }
}

tu remarquera que la variable httpRequest doit etre une variable globale et que tu ne peux passer de parametre a la fonction montreresults(), mais ce sont des incovenients mineurs.

voila dis-moi si ca marche.

@+ David

# Re: Exception lancée ?

Envoyé par : Cyrare

Date : 13/10/2004 16:53

Salut David, merci pour ta réponse, j'en suis arrivé à la même conclusion, mais ce n'est pas ça. Mais je suis content que quelqu'un me réponde ! ^^;;; En fait à la base, j'avais mis ça en mode synchrone, mais j'avais tenté de mettre true pour voir... Finalement, pendant quelques tests, j'ai fini par faire comme ce que tu appelles la manière élégante.

En fait, Après 2 jours de tests, j'ai vu que mon script ne marchait pas sur mon serveur, alors qu'il fonctionne très bien sur tous mes autres serveur.

Ma conclusion, c'est que xmlHttpRequest fait appel à quelque chose se trouvant sur le serveur que je n'ai pas ! Si tu as un moyen de m'expliquer quoi, ou au moins la manière de trouver cette info, ou de contacter quelqu'un qui sait, parce que je suis dans une impasse.

Je te montre un code minimaliste que j'ai fait pour tester :

<window [...]>

<script>
<![CDATA[

function ajouter()
{
	var httpRequest = new XMLHttpRequest();
	try
	{
		httpRequest.open("GET", "test.txt", true);
		var test = httpRequest.status;
	}
	catch (e)
	{
		alert("Erreur :\n" + e);
		return false;
	}
	httpRequest.onload = function() { alert(httpRequest.responseText); }	
}

]]>
</script>

<button label="Test" oncommand="ajouter(); return false;"/>
</window>

Donc ce code envoie l'exception sur mon serveur dédié, mais fonctionne très bien sur mes comptes gratuits tels que Free. Je desespère... T___T

Merci de ton aide !!

# Re: Exception lancée ?

Envoyé par : David@site

Date : 13/10/2004 17:48

As-tu essaye ce code?:

p = new XMLHttpRequest();
p.onload = null;
p.open("POST","http://monsite.com/mon_script.php", false);
p.setRequestHeader("Content-type","application/x-www-form-urlencoded");
var corps = "param1=valeur1&param2=valeur2";
p.send(corps);
if ( p.status != "200" ) {
     alert("Réception erreur " + p.status);
} else {
     contenu=p.responseText;
     // traitement du contenu
}

Precise bien le "http://monsite.com/" Parce que sinon je me demande ou mozilla va chercher le fichier: sur le meme serveur? sur ton disque local? j'avoue que j'ai un doute. En tout cas si tu veux que cela soit sur le disque local ou sur un autre domaine (http://autresite.com/) La il va falloir activer les privileges, sinon le modele de securite de mozilla va hurler (tu l'entend pas deja? :-)). normalement si ton script et le fichier a chercher son sur le meme serveur (http://monsite.com/) la tu n'as pas besoin d'activer de privileges. Mais je suis pas un speciliaste des privileges, je bosse que sur des applis chrome et elles ont tous les droits (pratique ca).

@+ David

# Re: Exception lancée ?

Envoyé par : Cyrare

Date : 13/10/2004 17:58

J'ai essayé, mais ça ne change rien.

Le fichier est bien à coté de mon fichier xul. Il est correctement lancé, parce que j'ai fait un essai avec un fichier php qui écrivait dans un 3me fichier les variables qu'il recevait et ça fonctionnait impec.

Par contre, responseText ne renvoie jamais rien, et .status renvoie chaque fois une exception.

Ceci dit, encore une fois, mon script fonctionne impécablement sur mon compte free par exemple, c'est bien preuve qu'il est bon... Simplement, uniquement sur mon serveur dédié, j'ai un tel souci. Donc je pense que xul a besoin de quelque chose se trouvant sur le serveur de fichier qu'il n'a pas... ?___? Surtout qu'il l'execute le fichier, mais ça plante après...

(Sinon, j'ai essayé de faire ça avec un fichier distant, effectivement, il m'a fait un petit caca nerveux ;))

# Re: Exception lancée ?

Envoyé par : David@site

Date : 13/10/2004 18:27

Ton dedie est bien configure? il renvoie bien le type-mime: application/vnd.mozilla.xul+xml? Autre piste, si l'Os de ton serveur est Linux: Est-ce que tu as bien acces en lecture sur ton fichier: test.txt?

Le truc que je ne comprend pas c'est que ce n'est pas le serveur qui execute ton code XUL, donc pas la peine de chercher ce qui manque a ton dedie pour executer du XUL: il n'a besoin de rien c'est ton navigateur Mozilla qui fait tout le travail! Le serveur lui doit juste se contenter de renvoyer le bon type-mime sinon Mozilla va s'emmeler les pinceaux. C'est comme du javascript, ton dedie ne fait rien c'est le navigateur du client qui fait tout.

# Re: Exception lancée ?

Envoyé par : Cyrare

Date : 13/10/2004 18:35

Je suis entièrement d'accord avec toi, d'où mon profond ettonnement...

J'ai donc bien mis les types mime oui, (vu que le fichier se lance) et j'ai mis un chmod à 777 sur le répertoire et ses fichiers pour pas être embêté par ça.

Je suis content parce que tu raisonnes comme moi, ça prouve que je suis pas un abruti avec un réponse évidente que je ne vois pas. ;)

Ce que je me demande, vu que XUL lance bien le fichier (sans le charger) et vu que .status lance une exception, si c'est pas mon apache qui doit lancer par exemple une information au navigateur (par exemple le status) et qu'il l'ommet, ou le fait mal, d'où l'erreur.

Mais dans ce cas, il faudrait que j'ai accès à ce qui déclanche l'exception 0x80040111 pour pouvoir changer ça... Et c'est là où j'en suis, parce qu'il n'y a aucune information de ce type sur le net... :( (Ou alors j'ai pas trouvé)

_EDIT_ : J'ai finalement trouvé le souci, et c'est tout de même incroyable comme bug : Il fallait que je rajoute flush(); à la toute fin dans mon fichier php, sinon il ne libérait pas automatiquement le buffer et donc je retournait rien, d'où tous mes soucis... Un flush à la fin d'un fichier php... J'aurais jamais cru devoir faire ça un jour... O__O

# Re: Exception lancée ?

Envoyé par : David@site

Date : 13/10/2004 19:09

Cyrare a écrit:

J'ai donc bien mis les types mime oui, (vu que le fichier se lance) et j'ai mis un chmod à 777 sur le répertoire et ses fichiers pour pas être embêté par ça.

tu es bien sur de ton type-mime? Le meilleure moyen c'est dans Mozilla: Affichage->Informations sur la page->Onglet Général->type: là tu dois avoir application/vnd.mozilla.xul+xml Parce que si tu as text/xml ou text/html ca ne vas pas deranger Mozilla te t'afficher la page (il l'interpretera comme du XML, car ton fichier .xul doit commencer par <?xml version="1.0" encoding="UTF-8"?>). C'est pas parce que ca a l'air de bien s'afficher que Mozilla prend ca pour du XUL.

Je suis content parce que tu raisonnes comme moi, ça prouve que je suis pas un abruti avec un réponse évidente que je ne vois pas. ;)

Ou alors on est deux abrutis? ;-)

Ce que je me demande, vu que XUL lance bien le fichier (sans le charger) et vu que .status lance une exception, si c'est pas mon apache qui doit lancer par exemple une information au navigateur (par exemple le status) et qu'il l'ommet, ou le fait mal, d'où l'erreur.

Pour le lancement d'une requete http il n'y a jamais de problemes (hormis les privileges), si elle tombe dans le vide ou echoue c'est a la lecture de le reponse (status ou responseText par exemple) que ca va poser probleme. Et Apache ne peut pas se planter au niveau des codes d'etat HTTP (200 ou autre), en tous cas c'est pas de ton ressort ce n'est pas accessible par httpd.conf. La seul chose dans notre cas ou il peut merdouiller c'est les type-mimes, mais toi tu attend un responseText , ca devrait marcher a tous les coup ca!!!

Personnelement les seul fois ou j'ai vu des exceptions se lancer avec XMLHttpRequest() c'etait dans les cas suivant:

_j'avais deja une autre instance de lancer.

_Deux instances essayait de se lancer en meme temps.

_j'etais en mode synchrone et j'essayais de lire la reponse avant qu'elle ne soit arrivée (d'ou ma solution numero 2, voir mon premier post plus haut, qui t'evite ce genre d'ennui).

_Le site auquel je fais une requete ne repond pas. (serveur down donc il ne me renvoie meme pas un code d'etat)


Mais dans ce cas, il faudrait que j'ai accès à ce qui déclanche l'exception 0x80040111 pour pouvoir changer ça... Et c'est là où j'en suis, parce qu'il n'y a aucune information de ce type sur le net... :( (Ou alors j'ai pas trouvé)

Ben là il n'y a que la console javascript de mozilla qui va nous aider... quoique Regarde tes logs d'apache (error et access) ils disent quoi quand tu essai de charger test.text?

# Re: Exception lancée ?

Envoyé par : Franck (odb)

Date : 25/10/2004 19:11

Salut,

Je suis content parce que tu raisonnes comme moi, ça prouve que je suis pas un abruti avec un réponse évidente que je ne vois pas. ;)

Ou alors on est deux abrutis? ;-)

on doit être 3 alors dans ce cas la ... j'ai mis un post ya quelque temps dans le forum "xpcom" a ce sujet ... sans succes !!

bref mon appli n'est pas une appli chrome mais une appli qui tourne sur un serveur web ...

voici mon code: @@ ...

     req.open("POST","InvitationAction",true);
     req.setRequestHeader("Content-Length", (mis.available())-2);
     req.setRequestHeader("Content-Type", "multipart/form-data, boundary="+BOUNDARY);
     req.send(mis);
     req.onload = function() {
     switch(req.readyState) {
       case 1,2,3:
  break;
case 4:
  if(req.status !=200) {
    alert("PROBLEME lors de la mise à jour des invitations ("+req.status+")");
    //alert(req.responseText);
  } else {
    //var responseXML = new DOMParser().parseFromString(req.responseText, 'text/xml');
    //alert("Status (2) : "+req.status);
    //alert(req.responseText);
    var respXML = new DOMParser().parseFromString(req.responseText, 'text/xml');
    var fault = respXML.getElementsByTagName("FAULT").item(0);
    if(fault){
      var ss = fault.getElementsByTagName("description").item(0).firstChild.nodeValue;
      alert("ERREUR : "+ss);
    }
    else {
      extract();
      window.location.reload();
    }
  }
  break;
};
     }

... @@

j'ai eu 2 fois cette exception sur le "req.status" mais ca fait 3 mois que cela fonctionne mais je n'ai pas d'explication rationnelle a fournir ...

j'espere avoir fais avancé le chmilblick ...

A+

F.

# Re: Exception lancée ?

Envoyé par : Utilisateur anonyme

Date : 17/03/2005 15:55

j'ai l'impression que ca surviendrai lorsque la reponse serait null. Quelqu'un qui peu confirmer? merci Julie ;)

# Re: Exception lancée ?

Envoyé par : Utilisateur anonyme

Date : 08/01/2006 16:23

hello je ne sais pas si ca interresse encore quelqu'un, mais mois j'ai une erreur "0x80040111" quand dans un formulaire appelant j'utilise onSubmit au lieu de action ....

# Re: [Réglé] Exception lancée ?

Envoyé par : hhf

Date : 08/01/2006 17:02

Bon, j'ai pas tous lu depuis le debut, mais j'ai vu quelques trucs ou je suis pas d'accord entre autre que l'object xmlHttpRequest doit etre global.... alors un url pour l'aide complete :

http://xulfr.org/wiki/ApplisWeb/Request

Et puis quelques commentaires et code

function askInformations() {
  var params="parm1=1;&param2=2";
  var req = new XMLHttpRequest();

// le troisieme argument de la methode open definie si c'est synchronne ou pas

// 1) GET synchronne

  req.open("GET", "informations.php"+params, false);
  req.send(null);

// 2) POST synchronne

  req.open("POST", "informations.php", false);
  req.setRequestHeader("Content-type",
                      "application/x-www-form-urlencoded");
  req.send(params);

// 1,2) GET ou POST synchronne

    if(req.status=="200") {
      var xmlFile=req.responseXML.documentElement;
      var status = eval(xmlFile.getAttribute("ok"));
      if(status) afficheInfo(xmlFile.getElementsByTagName("info"));
      else alert(xmlFile.getAttribute("msg"));
    } else alert("Réception erreur " + p.status);

// 3) GET asynchronne

  req.open("GET", "informations.php"+params, true);

// 4) POST asynchronne

  req.open("POST", "informations.php", true);
  req.setRequestHeader("Content-type",
                       "application/x-www-form-urlencoded");

// 3,4) GET ou POST asynchronne

  req.onreadystatechange=function() {
    if (req.readyState==4) {
      if(req.status==200) {
        var xmlFile=req.responseXML.documentElement;
        var status = eval(xmlFile.getAttribute("ok"));
        if(status) afficheInfo(xmlFile.getElementsByTagName("info"));
        else alert(xmlFile.getAttribute("msg"));
      } else alert("Réception erreur " + p.status);
    }
  };

// 3) GET asynchronne

  req.send(null);

// 4) POST asynchronne

  req.send(params);
}

// voila "toutes" les posibilités j'ai volontairement omis l'exploitation du resultat via un responseText, qui exploite un fichier retour en mode texte.

le fichier reponse pourait dans mon cas ressembler à ca :

<?xml version="1.0" encoding="utf-8"?>
<response ok="" msg="">
  <infos>
    <info name="" value=""/>
    <info name="" value=""/>
    <info name="" value=""/>
    <info name="" value=""/>
    <info name="" value=""/>
    <info name="" value=""/>
  </infos>
</response>

donc je met l'attribut 'ok' à true ou false en fonction si le serveur à remonter une erreur (ex : la base de données est tombé) dans l'attribut 'msg' je met le message d'erreur que je veux afficher.

et puis vienne les infos...

Voila j'esperes que ca en aidera plus d'un

Il n'est plus possible de poster des messages dans ce forum.


Copyright © 2003-2013 association xulfr, 2013-2016 Laurent Jouanneau - Informations légales.

Mozilla® est une marque déposée de la fondation Mozilla.
Mozilla.org™, Firefox™, Thunderbird™, Mozilla Suite™ et XUL™ sont des marques de la fondation Mozilla.