OVH Cloud OVH Cloud

Exception non catchée dans un drag/drop

9 réponses
Avatar
Ludovic SOEUR
Je ne comprends pas pourquoi quand une opération de drag/drop est lancée
avec DoDragDrop, aucune exception n'est récupérée.
Les lignes suivantes illustrent mes propos. Dans l'événement Form2_DragDrop,
je force une exception avec la ligne "int b=1/a" (donc le message After
Exception ne sera pas affiché). Pourquoi cette exception n'est pas catchée ?

using System;
using System.Windows.Forms;

public class Form2 : System.Windows.Forms.Form {
[STAThread]
static void Main() {
Application.Run(new Form2());
}

public Form2() {
this.MouseDown += new
System.Windows.Forms.MouseEventHandler(this.Form2_MouseDown);
this.DragDrop += new
System.Windows.Forms.DragEventHandler(this.Form2_DragDrop);
this.DragEnter += new
System.Windows.Forms.DragEventHandler(this.Form2_DragEnter);
this.AllowDrop = true;
}

private void Form2_MouseDown(object sender,
System.Windows.Forms.MouseEventArgs e) {
DoDragDrop(this,DragDropEffects.All);
}

private void Form2_DragEnter(object sender,
System.Windows.Forms.DragEventArgs e) {
e.Effect=DragDropEffects.Copy;
}

private void Form2_DragDrop(object sender,
System.Windows.Forms.DragEventArgs e) {
int a=0;
MessageBox.Show("Before exception");
int b=1/a;
MessageBox.Show("After exception");
}
}


Merci par avance,
Ludovic SOEUR

9 réponses

Avatar
Paul Bacelar
Vue générale;

http://msdn.microsoft.com/msdnmag/issues/04/06/NET/



Il semblerais que la boite de dialogue d'alerte n'apprécie pas le DargDrop.


--
Paul Bacelar

"Ludovic SOEUR" wrote in message
news:#kjg$
Je ne comprends pas pourquoi quand une opération de drag/drop est lancée
avec DoDragDrop, aucune exception n'est récupérée.
Les lignes suivantes illustrent mes propos. Dans l'événement


Form2_DragDrop,
je force une exception avec la ligne "int b=1/a" (donc le message After
Exception ne sera pas affiché). Pourquoi cette exception n'est pas catchée


?

using System;
using System.Windows.Forms;

public class Form2 : System.Windows.Forms.Form {
[STAThread]
static void Main() {
Application.Run(new Form2());
}

public Form2() {
this.MouseDown += new
System.Windows.Forms.MouseEventHandler(this.Form2_MouseDown);
this.DragDrop += new
System.Windows.Forms.DragEventHandler(this.Form2_DragDrop);
this.DragEnter += new
System.Windows.Forms.DragEventHandler(this.Form2_DragEnter);
this.AllowDrop = true;
}

private void Form2_MouseDown(object sender,
System.Windows.Forms.MouseEventArgs e) {
DoDragDrop(this,DragDropEffects.All);
}

private void Form2_DragEnter(object sender,
System.Windows.Forms.DragEventArgs e) {
e.Effect=DragDropEffects.Copy;
}

private void Form2_DragDrop(object sender,
System.Windows.Forms.DragEventArgs e) {
int a=0;
MessageBox.Show("Before exception");
int b=1/a;
MessageBox.Show("After exception");
}
}


Merci par avance,
Ludovic SOEUR





Avatar
Ludovic SOEUR
Merci pour l'article très interessant sur le débat toujours ouvert sur les
exceptions.

Cependant, le code que j'ai présenté avait pour but de montrer en quelques
lignes le problème. Il est clair que de toutes façons, il n'y a pas de
MessageBox dans mon code pendant le drag/drop.
Le vrai problème est que s'il y a effectivement un bug non prévu (appel à
une méthode d'un objet non instancié par exemple ou bien out of memory), le
programme ne va pas afficher le message d'erreur de plantage de l'appli mais
laisser l'application se dérouler normalement comme si rien ne s'était
passé...sauf que l'appli n'aura pas executé tout le code qui se trouvait
après le plantage...et ca c'est très embêtant...
Vous me direz que je peux ajouter des tests de nullité de partout mais là
n'est pas le problème. Un simple "out of memory" peut m'envoyer le code en
l'air sans que j'en ai ni la connaissance, ni la cause et ni la possibilité
de faire marche arrière.
Mon but n'est pas de récupérer l'erreur mais de faire crasher l'application
quand il y a une erreur non prévue. C'est pour ça que je ne veux pas
utiliser un seul try/catch...pourtant apparemment, c'est ce qui se passe
lors d'un drag/drop.

Avez-vous une idée de ce qui pourrait être fait pour faire qqch de propre ?
Pour l'instant, j'utilise un patch qui fonctionne mais que ne me convient
pas.
J'encadre TOUTES mes méthodes de drag/drop par un try catch de ce type là :
try {
......
} catch (Exception e) {
DragDropException=e;
}

avec bien entendu DragDropException une variable globale à la Form.
Et dans le code, j'utilise les lignes suivantes pour lancer une opération de
drag/drop:
DragDropException=null;
DoDragDrop(this,DragDropEffects.All);
if (DragDropException!=null) throw DragDropException;

Ainsi, s'il y a un plantage de l'appli pendant une opération de drag/drop,
je peux récupérer le problème et faire planter l'appli. Seulement, l'astuce
présentée précédemment utilise des try/catch alors que je suis sûr que c'est
inutile et que l'on pourrait s'en passer...mais comment ?

Une idée ?

Merci par avance,

Ludovic Soeur.

"Paul Bacelar" a écrit dans le message
de news:d17vmm$n3c$
Vue générale;

http://msdn.microsoft.com/msdnmag/issues/04/06/NET/



Il semblerais que la boite de dialogue d'alerte n'apprécie pas le


DargDrop.


--
Paul Bacelar

"Ludovic SOEUR" wrote in message
news:#kjg$
> Je ne comprends pas pourquoi quand une opération de drag/drop est lancée
> avec DoDragDrop, aucune exception n'est récupérée.
> Les lignes suivantes illustrent mes propos. Dans l'événement
Form2_DragDrop,
> je force une exception avec la ligne "int b=1/a" (donc le message After
> Exception ne sera pas affiché). Pourquoi cette exception n'est pas


catchée
?
>
> using System;
> using System.Windows.Forms;
>
> public class Form2 : System.Windows.Forms.Form {
> [STAThread]
> static void Main() {
> Application.Run(new Form2());
> }
>
> public Form2() {
> this.MouseDown += new
> System.Windows.Forms.MouseEventHandler(this.Form2_MouseDown);
> this.DragDrop += new
> System.Windows.Forms.DragEventHandler(this.Form2_DragDrop);
> this.DragEnter += new
> System.Windows.Forms.DragEventHandler(this.Form2_DragEnter);
> this.AllowDrop = true;
> }
>
> private void Form2_MouseDown(object sender,
> System.Windows.Forms.MouseEventArgs e) {
> DoDragDrop(this,DragDropEffects.All);
> }
>
> private void Form2_DragEnter(object sender,
> System.Windows.Forms.DragEventArgs e) {
> e.Effect=DragDropEffects.Copy;
> }
>
> private void Form2_DragDrop(object sender,
> System.Windows.Forms.DragEventArgs e) {
> int a=0;
> MessageBox.Show("Before exception");
> int b=1/a;
> MessageBox.Show("After exception");
> }
> }
>
>
> Merci par avance,
> Ludovic SOEUR
>
>
>




Avatar
Paul Bacelar
J'ai suivi en mode pas à pas en assembleur votre exemple et ce que j'ai vu
est que la routine d'affichage d'erreur attend le moment propice pour
afficher la boite de dialogue.

L'erreur n'a pas été catchée mais le runtime cherche à afficher les erreurs
dans de bonnes conditions.

Si vous inspecter la pile lors de l'affichage de la première messagebox
après une première erreur (2ème dragAndDrop de suite), vous y verrez les
routines du runtime qui attendent que la voie soit libre pour afficher leur
boite de dialogue.

Les exceptions ne sont pas perdues mais leur affichage est empilé.

Avez-vous le même problème en Release?
--
Paul Bacelar


"Ludovic SOEUR" wrote in message
news:eKVDK$
Merci pour l'article très interessant sur le débat toujours ouvert sur les
exceptions.

Cependant, le code que j'ai présenté avait pour but de montrer en quelques
lignes le problème. Il est clair que de toutes façons, il n'y a pas de
MessageBox dans mon code pendant le drag/drop.
Le vrai problème est que s'il y a effectivement un bug non prévu (appel à
une méthode d'un objet non instancié par exemple ou bien out of memory),


le
programme ne va pas afficher le message d'erreur de plantage de l'appli


mais
laisser l'application se dérouler normalement comme si rien ne s'était
passé...sauf que l'appli n'aura pas executé tout le code qui se trouvait
après le plantage...et ca c'est très embêtant...
Vous me direz que je peux ajouter des tests de nullité de partout mais là
n'est pas le problème. Un simple "out of memory" peut m'envoyer le code en
l'air sans que j'en ai ni la connaissance, ni la cause et ni la


possibilité
de faire marche arrière.
Mon but n'est pas de récupérer l'erreur mais de faire crasher


l'application
quand il y a une erreur non prévue. C'est pour ça que je ne veux pas
utiliser un seul try/catch...pourtant apparemment, c'est ce qui se passe
lors d'un drag/drop.

Avez-vous une idée de ce qui pourrait être fait pour faire qqch de propre


?
Pour l'instant, j'utilise un patch qui fonctionne mais que ne me convient
pas.
J'encadre TOUTES mes méthodes de drag/drop par un try catch de ce type là


:
try {
......
} catch (Exception e) {
DragDropException=e;
}

avec bien entendu DragDropException une variable globale à la Form.
Et dans le code, j'utilise les lignes suivantes pour lancer une opération


de
drag/drop:
DragDropException=null;
DoDragDrop(this,DragDropEffects.All);
if (DragDropException!=null) throw DragDropException;

Ainsi, s'il y a un plantage de l'appli pendant une opération de drag/drop,
je peux récupérer le problème et faire planter l'appli. Seulement,


l'astuce
présentée précédemment utilise des try/catch alors que je suis sûr que


c'est
inutile et que l'on pourrait s'en passer...mais comment ?

Une idée ?

Merci par avance,

Ludovic Soeur.

"Paul Bacelar" a écrit dans le message
de news:d17vmm$n3c$
> Vue générale;
>
> http://msdn.microsoft.com/msdnmag/issues/04/06/NET/
>
>
>
> Il semblerais que la boite de dialogue d'alerte n'apprécie pas le
DargDrop.
>
>
> --
> Paul Bacelar
>
> "Ludovic SOEUR" wrote in message
> news:#kjg$
> > Je ne comprends pas pourquoi quand une opération de drag/drop est


lancée
> > avec DoDragDrop, aucune exception n'est récupérée.
> > Les lignes suivantes illustrent mes propos. Dans l'événement
> Form2_DragDrop,
> > je force une exception avec la ligne "int b=1/a" (donc le message


After
> > Exception ne sera pas affiché). Pourquoi cette exception n'est pas
catchée
> ?
> >
> > using System;
> > using System.Windows.Forms;
> >
> > public class Form2 : System.Windows.Forms.Form {
> > [STAThread]
> > static void Main() {
> > Application.Run(new Form2());
> > }
> >
> > public Form2() {
> > this.MouseDown += new
> > System.Windows.Forms.MouseEventHandler(this.Form2_MouseDown);
> > this.DragDrop += new
> > System.Windows.Forms.DragEventHandler(this.Form2_DragDrop);
> > this.DragEnter += new
> > System.Windows.Forms.DragEventHandler(this.Form2_DragEnter);
> > this.AllowDrop = true;
> > }
> >
> > private void Form2_MouseDown(object sender,
> > System.Windows.Forms.MouseEventArgs e) {
> > DoDragDrop(this,DragDropEffects.All);
> > }
> >
> > private void Form2_DragEnter(object sender,
> > System.Windows.Forms.DragEventArgs e) {
> > e.Effect=DragDropEffects.Copy;
> > }
> >
> > private void Form2_DragDrop(object sender,
> > System.Windows.Forms.DragEventArgs e) {
> > int a=0;
> > MessageBox.Show("Before exception");
> > int b=1/a;
> > MessageBox.Show("After exception");
> > }
> > }
> >
> >
> > Merci par avance,
> > Ludovic SOEUR
> >
> >
> >
>
>




Avatar
Ludovic SOEUR
J'ai exactement le même problème en release.
Par contre, votre explication m'a beaucoup intéressé. Elle montre clairement
qu'il doit être possible de récupérer l'exception et qu'elle n'est pas
perdue. Maintenant reste à trouver comment la récupérer...
Une idée ?




"Paul Bacelar" a écrit dans le message
de news:%
J'ai suivi en mode pas à pas en assembleur votre exemple et ce que j'ai vu
est que la routine d'affichage d'erreur attend le moment propice pour
afficher la boite de dialogue.

L'erreur n'a pas été catchée mais le runtime cherche à afficher les


erreurs
dans de bonnes conditions.

Si vous inspecter la pile lors de l'affichage de la première messagebox
après une première erreur (2ème dragAndDrop de suite), vous y verrez les
routines du runtime qui attendent que la voie soit libre pour afficher


leur
boite de dialogue.

Les exceptions ne sont pas perdues mais leur affichage est empilé.

Avez-vous le même problème en Release?
--
Paul Bacelar


"Ludovic SOEUR" wrote in message
news:eKVDK$
> Merci pour l'article très interessant sur le débat toujours ouvert sur


les
> exceptions.
>
> Cependant, le code que j'ai présenté avait pour but de montrer en


quelques
> lignes le problème. Il est clair que de toutes façons, il n'y a pas de
> MessageBox dans mon code pendant le drag/drop.
> Le vrai problème est que s'il y a effectivement un bug non prévu (appel


à
> une méthode d'un objet non instancié par exemple ou bien out of memory),
le
> programme ne va pas afficher le message d'erreur de plantage de l'appli
mais
> laisser l'application se dérouler normalement comme si rien ne s'était
> passé...sauf que l'appli n'aura pas executé tout le code qui se trouvait
> après le plantage...et ca c'est très embêtant...
> Vous me direz que je peux ajouter des tests de nullité de partout mais



> n'est pas le problème. Un simple "out of memory" peut m'envoyer le code


en
> l'air sans que j'en ai ni la connaissance, ni la cause et ni la
possibilité
> de faire marche arrière.
> Mon but n'est pas de récupérer l'erreur mais de faire crasher
l'application
> quand il y a une erreur non prévue. C'est pour ça que je ne veux pas
> utiliser un seul try/catch...pourtant apparemment, c'est ce qui se passe
> lors d'un drag/drop.
>
> Avez-vous une idée de ce qui pourrait être fait pour faire qqch de


propre
?
> Pour l'instant, j'utilise un patch qui fonctionne mais que ne me


convient
> pas.
> J'encadre TOUTES mes méthodes de drag/drop par un try catch de ce type



:
> try {
> ......
> } catch (Exception e) {
> DragDropException=e;
> }
>
> avec bien entendu DragDropException une variable globale à la Form.
> Et dans le code, j'utilise les lignes suivantes pour lancer une


opération
de
> drag/drop:
> DragDropException=null;
> DoDragDrop(this,DragDropEffects.All);
> if (DragDropException!=null) throw DragDropException;
>
> Ainsi, s'il y a un plantage de l'appli pendant une opération de


drag/drop,
> je peux récupérer le problème et faire planter l'appli. Seulement,
l'astuce
> présentée précédemment utilise des try/catch alors que je suis sûr que
c'est
> inutile et que l'on pourrait s'en passer...mais comment ?
>
> Une idée ?
>
> Merci par avance,
>
> Ludovic Soeur.
>
> "Paul Bacelar" a écrit dans le


message
> de news:d17vmm$n3c$
> > Vue générale;
> >
> > http://msdn.microsoft.com/msdnmag/issues/04/06/NET/
> >
> >
> >
> > Il semblerais que la boite de dialogue d'alerte n'apprécie pas le
> DargDrop.
> >
> >
> > --
> > Paul Bacelar
> >
> > "Ludovic SOEUR" wrote in message
> > news:#kjg$
> > > Je ne comprends pas pourquoi quand une opération de drag/drop est
lancée
> > > avec DoDragDrop, aucune exception n'est récupérée.
> > > Les lignes suivantes illustrent mes propos. Dans l'événement
> > Form2_DragDrop,
> > > je force une exception avec la ligne "int b=1/a" (donc le message
After
> > > Exception ne sera pas affiché). Pourquoi cette exception n'est pas
> catchée
> > ?
> > >
> > > using System;
> > > using System.Windows.Forms;
> > >
> > > public class Form2 : System.Windows.Forms.Form {
> > > [STAThread]
> > > static void Main() {
> > > Application.Run(new Form2());
> > > }
> > >
> > > public Form2() {
> > > this.MouseDown += new
> > > System.Windows.Forms.MouseEventHandler(this.Form2_MouseDown);
> > > this.DragDrop += new
> > > System.Windows.Forms.DragEventHandler(this.Form2_DragDrop);
> > > this.DragEnter += new
> > > System.Windows.Forms.DragEventHandler(this.Form2_DragEnter);
> > > this.AllowDrop = true;
> > > }
> > >
> > > private void Form2_MouseDown(object sender,
> > > System.Windows.Forms.MouseEventArgs e) {
> > > DoDragDrop(this,DragDropEffects.All);
> > > }
> > >
> > > private void Form2_DragEnter(object sender,
> > > System.Windows.Forms.DragEventArgs e) {
> > > e.Effect=DragDropEffects.Copy;
> > > }
> > >
> > > private void Form2_DragDrop(object sender,
> > > System.Windows.Forms.DragEventArgs e) {
> > > int a=0;
> > > MessageBox.Show("Before exception");
> > > int b=1/a;
> > > MessageBox.Show("After exception");
> > > }
> > > }
> > >
> > >
> > > Merci par avance,
> > > Ludovic SOEUR
> > >
> > >
> > >
> >
> >
>
>




Avatar
Paul Bacelar
"Ludovic SOEUR" wrote in message
news:Oz7$
J'ai exactement le même problème en release.
Par contre, votre explication m'a beaucoup intéressé. Elle montre


clairement
qu'il doit être possible de récupérer l'exception et qu'elle n'est pas
perdue. Maintenant reste à trouver comment la récupérer...
Une idée ?






Avec un try{}catch{}?
Je ne suis pas trop.



--
Paul Bacelar
Avatar
Ludovic SOEUR
Je reprends donc :

Dans le code, je lance l'opération de drag/drop par :
private void Form2_MouseDown(object sender,
System.Windows.Forms.MouseEventArgs e) {
DoDragDrop(this,DragDropEffects.All);
}
Si à la place, j'utilise les lignes suivantes :
private void Form2_MouseDown(object sender,
System.Windows.Forms.MouseEventArgs e) {
try {
DoDragDrop(this,DragDropEffects.All);
MessageBox.Show("Après le drag");
} catch(Exception ex) {
throw ex;
}
}
l'exception n'est pas levée et le message "Après le drag" s'affiche, alors
qu'il faudrait que l'on passe dans le catch.
et même encore mieux, que l'on ait même pas à faire un try catch avec un
thow puisque je veux simplement que l'exception mefasse terminer le
programme.

J'ai été un peu plus clair ?


"Paul Bacelar" a écrit dans le message
de news:%

"Ludovic SOEUR" wrote in message
news:Oz7$
> J'ai exactement le même problème en release.
> Par contre, votre explication m'a beaucoup intéressé. Elle montre
clairement
> qu'il doit être possible de récupérer l'exception et qu'elle n'est pas
> perdue. Maintenant reste à trouver comment la récupérer...
> Une idée ?
>
>
>
>
Avec un try{}catch{}?
Je ne suis pas trop.



--
Paul Bacelar




Avatar
Paul Bacelar
J'ai de mauvaises nouvelles :-(
J'ai utilisé reflector sur DoDragDrop de la class Control

<REFLECTOR>
public DragDropEffects DoDragDrop(object data, DragDropEffects
allowedEffects)
{
int[] numArray2 = new int[1];
int[] numArray1 = numArray2;
UnsafeNativeMethods.IOleDropSource source1 = new
Control.DropSource(this);
UnsafeNativeMethods.IOleDataObject obj1 = null;
if (data is UnsafeNativeMethods.IOleDataObject)
{
obj1 = (UnsafeNativeMethods.IOleDataObject) data;
}
else
{
DataObject obj2 = null;
if (data is IDataObject)
{
obj2 = new DataObject((IDataObject) data);
}
else
{
obj2 = new DataObject();
obj2.SetData(data);
}
obj1 = obj2;
}
try
{
SafeNativeMethods.DoDragDrop(obj1, source1, (int)
allowedEffects, numArray1);
}
catch (Exception)
{
}
return (DragDropEffects) numArray1[0];
}
</REFLECTOR>
Vous voyez le très laid try{}catch(Exception){...} entourant
"SafeNativeMethods.DoDragDrop(obj1, source1, (int) allowedEffects,
numArray1);"
Et bien les handlers d'évènement DragDrop sont appelés par cette ligne.
Vous ne récupérerez jamais une exception levée dans un handler sur un
dragDrop car la CLR c'est blindée contre le code appelé.
--
Paul Bacelar

"Ludovic SOEUR" wrote in message
news:#m4h#
Je reprends donc :

Dans le code, je lance l'opération de drag/drop par :
private void Form2_MouseDown(object sender,
System.Windows.Forms.MouseEventArgs e) {
DoDragDrop(this,DragDropEffects.All);
}
Si à la place, j'utilise les lignes suivantes :
private void Form2_MouseDown(object sender,
System.Windows.Forms.MouseEventArgs e) {
try {
DoDragDrop(this,DragDropEffects.All);
MessageBox.Show("Après le drag");
} catch(Exception ex) {
throw ex;
}
}
l'exception n'est pas levée et le message "Après le drag" s'affiche, alors
qu'il faudrait que l'on passe dans le catch.
et même encore mieux, que l'on ait même pas à faire un try catch avec un
thow puisque je veux simplement que l'exception mefasse terminer le
programme.

J'ai été un peu plus clair ?


"Paul Bacelar" a écrit dans le message
de news:%
>
> "Ludovic SOEUR" wrote in message
> news:Oz7$
> > J'ai exactement le même problème en release.
> > Par contre, votre explication m'a beaucoup intéressé. Elle montre
> clairement
> > qu'il doit être possible de récupérer l'exception et qu'elle n'est pas
> > perdue. Maintenant reste à trouver comment la récupérer...
> > Une idée ?
> >
> >
> >
> >
> Avec un try{}catch{}?
> Je ne suis pas trop.
>
>
>
> --
> Paul Bacelar
>
>




Avatar
bacelar
J'ai de mauvaises nouvelles :-(
J'ai utilisé reflector sur DoDragDrop de la class Control

<REFLECTOR>
public DragDropEffects DoDragDrop(object data, DragDropEffects
allowedEffects)
{
int[] numArray2 = new int[1];
int[] numArray1 = numArray2;
UnsafeNativeMethods.IOleDropSource source1 = new
Control.DropSource(this);
UnsafeNativeMethods.IOleDataObject obj1 = null;
if (data is UnsafeNativeMethods.IOleDataObject)
{
obj1 = (UnsafeNativeMethods.IOleDataObject) data;
}
else
{
DataObject obj2 = null;
if (data is IDataObject)
{
obj2 = new DataObject((IDataObject) data);
}
else
{
obj2 = new DataObject();
obj2.SetData(data);
}
obj1 = obj2;
}
try
{
SafeNativeMethods.DoDragDrop(obj1, source1, (int)
allowedEffects, numArray1);
}
catch (Exception)
{
}
return (DragDropEffects) numArray1[0];
}
</REFLECTOR>
Vous voyez le très laid try{}catch(Exception){...} entourant
"SafeNativeMethods.DoDragDrop(obj1, source1, (int) allowedEffects,
numArray1);"
Et bien les handlers d'évènement DragDrop sont appelés par cette ligne.
Vous ne récupérerez jamais une exception levée dans un handler sur un
dragDrop car la CLR c'est blindée contre le code appelé.
--
Paul Bacelar

"Ludovic SOEUR" wrote in message news:<#m4h#...
Je reprends donc :

Dans le code, je lance l'opération de drag/drop par :
private void Form2_MouseDown(object sender,
System.Windows.Forms.MouseEventArgs e) {
DoDragDrop(this,DragDropEffects.All);
}
Si à la place, j'utilise les lignes suivantes :
private void Form2_MouseDown(object sender,
System.Windows.Forms.MouseEventArgs e) {
try {
DoDragDrop(this,DragDropEffects.All);
MessageBox.Show("Après le drag");
} catch(Exception ex) {
throw ex;
}
}
l'exception n'est pas levée et le message "Après le drag" s'affiche, alors
qu'il faudrait que l'on passe dans le catch.
et même encore mieux, que l'on ait même pas à faire un try catch avec un
thow puisque je veux simplement que l'exception mefasse terminer le
programme.

J'ai été un peu plus clair ?


"Paul Bacelar" a écrit dans le message
de news:%
>
> "Ludovic SOEUR" wrote in message
> news:Oz7$
> > J'ai exactement le même problème en release.
> > Par contre, votre explication m'a beaucoup intéressé. Elle montre
> clairement
> > qu'il doit être possible de récupérer l'exception et qu'elle n'est pas
> > perdue. Maintenant reste à trouver comment la récupérer...
> > Une idée ?
> >
> >
> >
> >
> Avec un try{}catch{}?
> Je ne suis pas trop.
>
>
>
> --
> Paul Bacelar
>
>


Avatar
Ludovic SOEUR
Merci énormément Paul pour votre réponse TRES complète et pour le temps que
vous avez passé dessus.
En effet, vu le code donné avec reflector, il est clair que l'exception ne
peut pas être catchée...
c'est donc à moi de gérer le fait qu'il puisse y avoir un problème et de
faire en sorte de ne modifier aucune variable sensible globale à la classe
pendant un drag/drop.
J'espère que dans la prochaine version des Windows Form, ils auront corrigé
cet aspect.

Merci encore pour vos lumières.

Ludovic Soeur.



"Paul Bacelar" a écrit dans le message de
news:
J'ai de mauvaises nouvelles :-(
J'ai utilisé reflector sur DoDragDrop de la class Control

<REFLECTOR>
public DragDropEffects DoDragDrop(object data, DragDropEffects
allowedEffects)
{
int[] numArray2 = new int[1];
int[] numArray1 = numArray2;
UnsafeNativeMethods.IOleDropSource source1 = new
Control.DropSource(this);
UnsafeNativeMethods.IOleDataObject obj1 = null;
if (data is UnsafeNativeMethods.IOleDataObject)
{
obj1 = (UnsafeNativeMethods.IOleDataObject) data;
}
else
{
DataObject obj2 = null;
if (data is IDataObject)
{
obj2 = new DataObject((IDataObject) data);
}
else
{
obj2 = new DataObject();
obj2.SetData(data);
}
obj1 = obj2;
}
try
{
SafeNativeMethods.DoDragDrop(obj1, source1, (int)
allowedEffects, numArray1);
}
catch (Exception)
{
}
return (DragDropEffects) numArray1[0];
}
</REFLECTOR>
Vous voyez le très laid try{}catch(Exception){...} entourant
"SafeNativeMethods.DoDragDrop(obj1, source1, (int) allowedEffects,
numArray1);"
Et bien les handlers d'évènement DragDrop sont appelés par cette ligne.
Vous ne récupérerez jamais une exception levée dans un handler sur un
dragDrop car la CLR c'est blindée contre le code appelé.
--
Paul Bacelar

"Ludovic SOEUR" wrote in message


news:<#m4h#...
> Je reprends donc :
>
> Dans le code, je lance l'opération de drag/drop par :
> private void Form2_MouseDown(object sender,
> System.Windows.Forms.MouseEventArgs e) {
> DoDragDrop(this,DragDropEffects.All);
> }
> Si à la place, j'utilise les lignes suivantes :
> private void Form2_MouseDown(object sender,
> System.Windows.Forms.MouseEventArgs e) {
> try {
> DoDragDrop(this,DragDropEffects.All);
> MessageBox.Show("Après le drag");
> } catch(Exception ex) {
> throw ex;
> }
> }
> l'exception n'est pas levée et le message "Après le drag" s'affiche,


alors
> qu'il faudrait que l'on passe dans le catch.
> et même encore mieux, que l'on ait même pas à faire un try catch avec un
> thow puisque je veux simplement que l'exception mefasse terminer le
> programme.
>
> J'ai été un peu plus clair ?
>
>
> "Paul Bacelar" a écrit dans le


message
> de news:%
> >
> > "Ludovic SOEUR" wrote in message
> > news:Oz7$
> > > J'ai exactement le même problème en release.
> > > Par contre, votre explication m'a beaucoup intéressé. Elle montre
> > clairement
> > > qu'il doit être possible de récupérer l'exception et qu'elle n'est


pas
> > > perdue. Maintenant reste à trouver comment la récupérer...
> > > Une idée ?
> > >
> > >
> > >
> > >
> > Avec un try{}catch{}?
> > Je ne suis pas trop.
> >
> >
> >
> > --
> > Paul Bacelar
> >
> >