2011-07-10 6 views
3

Je vais commencer par dire que je ne suis pas un débutant en C# mais pas beaucoup plus et besoin d'aide pour retourner la valeur à la main. Ou plutôt dites-moi quelle est la "bonne" façon.retourner la valeur à la main C#

Je veux retourner une valeur d'échec (simplement -1) à partir de l'application, en cas d'exception et se retrouver dans une capture. Dans ce cas, transmettre info à main pour retourner -1. La façon dont je l'ai résolu consistait simplement à ajouter une variable globale statique mainReturnValue (pour pouvoir y accéder à partir de main), et à mettre sa valeur à -1 dans les captures.

Est-ce une façon correcte de le faire, basé sur mon code actuel?

Si quelqu'un se demande si les applications sont exécutées sans intervention de l'utilisateur, c'est pourquoi j'ai besoin d'attraper l'état de sortie. Le formulaire/l'interface graphique affiche uniquement des informations sur la progression, au cas où il a été démarré manuellement.

namespace ApplicationName 
{ 
/// <summary> 
/// Summary description for Form1. 
/// </summary> 
public class Form1 : System.Windows.Forms.Form 
{ ... 

static int mainReturnValue = 0; //the return var 

static int Main(string[] args) 
{ 
    Application.Run(new Form1(args)); 

    return mainReturnValue; //returning 0 or -1 before exit 
} 

private void Form1_Load(object sender, System.EventArgs e) 
{ 
    the code..in turn also calling some sub functions such as DoExportData...and I want to be able to return the value to main from any function... 
} 

private int DoExportData(DataRow dr, string cmdText) 
{ 
    try { ... } 
    catch 
    { mainReturnValue = -1; } 
} 

Merci.

Répondre

7

Vous pouvez le faire:

static int Main(string[] args) 
{ 
    Form1 form1 = new Form1(args); 
    Application.Run(form1); 
    return form1.Result; 
} 

puis définir une propriété sur votre classe Form1, dont la valeur que vous pouvez définir après la méthode DoExportData exécute. Par exemple:

public int Result { get; private set; } 

private void Form1_Load(object sender, System.EventArgs e) 
{ 
    Result = DoExportData(...); 
} 

private int DoExportData(DataRow dr, string cmdText) 
{ 
    try 
    { 
     ... 
     return 0; 
    } 
    catch 
    { 
     return -1; 
    } 
} 
+0

Je ne vois pas comment cela peut fonctionner. Vous ne pouvez accéder à la ligne après 'Application.Run' en fermant' form1'. D'ici là, 'form1.Result' n'existe plus –

+0

@EMett Après que' Application.Run() 'a terminé, le formulaire ne sera plus affiché, mais l'objet référencé par' form1' existe toujours. – Galax

1

Je voudrais ajouter aussi quelque chose comme ça

AppDomain currentDomain = AppDomain.CurrentDomain; 
    currentDomain.UnhandledException += new UnhandledExceptionEventHandler(CrashHandler); 


    static void CrashHandler(object sender, UnhandledExceptionEventArgs args) { 
    mainReturnValue = -1; 
    } 

Juste pour être sûr que même les exceptions non gérées sont « traitées » par l'application d'une manière que vous voulez, parce que je suppose que votre application est non seulement un WindowsForm.

Questions connexes