2012-12-27 5 views
1

J'ai du mal à comprendre pourquoi cela renvoie toujours une variable videValeur chaîne Catch Essayez dans Vb.net

Private Function checkEnvelopeStatus(aEnvelopeID As String) As String 
    Dim lEnvelopeStatusMessage As String 

    Try 
     Dim lEnvelopeStatus = mDsapi.RequestStatusEx(aEnvelopeID) 
     lEnvelopeStatusMessage = "Subject:" & lEnvelopeStatus.Subject & vbCrLf & "Status Code: " & lEnvelopeStatus.Status 
    Catch ex As Exception 
     MessageBox.Show(ex.StackTrace, ex.Message) 
    End Try 

    Return lEnvelopeStatusMessage 
End Function 

Pourtant, ce retourne le message que je veux

Private Function checkEnvelopeStatus(aEnvelopeID As String) As String 
    Dim lEnvelopeStatusMessage As String 

    Try 
     Dim lEnvelopeStatus = mDsapi.RequestStatusEx(aEnvelopeID) 
     aEnvelopeID = "Subject:" & lEnvelopeStatus.Subject & vbCrLf & "Status Code: " & lEnvelopeStatus.Status 
    Catch ex As Exception 
     MessageBox.Show(ex.StackTrace, ex.Message) 
    End Try 

    Return aEnvelopeID 
End Function 

Il semble que la valeur de la chaîne lorsqu'il s'agit d'une variable locale à la fonction est effacée après la fermeture de la capture TRy. Pourtant, quand je le remplace par le paramètre entrant je suis capable de préserver la chaîne externe au Try Catch? Je suis principalement un développeur C#/C++ donc c'est un comportement déroutant pour moi. Quelqu'un peut-il expliquer pourquoi cela pourrait arriver?

Voici une version beaucoup plus aseptisé du code ci-dessus

Public Function foo(a As String) As String 
    Dim b As String 
    Try 
     b = "banana:" 
    Catch ex As Exception 

    End Try 

    Return b 
End Function 

Il présente le même comportement.

Répondre

3

En C#, vous ne pouvez pas compiler le code d'une méthode dans laquelle un chemin existe, dans le flux d'exécution, pouvant entraîner la sortie de la méthode sans initialiser la valeur de retour. Vous obtenez une erreur de compilation pour l'utilisation d'une variable non affectée.

Dans VB.NET vous auriez évité l'erreur si vous aviez changé l'option « Utilisation de la variable avant assignement » de Avertissement à Erreur dans la page Construction de vos options de projet. (Et je vous recommande fortement de le faire)

(Je ne sais pas le nom exact de l'option parce que j'utilise une version localisée de Visual Studio)

0

j'ai écrit le même code en C#

public string foo(string a) 
{ 
    String b; 
    try 
    { 
     b = "banana"; 
    } 
    catch 
    { 

    } 

    return b; 
} 

}

Il ne semble le même comportement. J'ai été ramené. En y réfléchissant plus, cela a du sens. Je déclare simplement que la variable ne la définit pas encore pour l'instant. Donc, en remplaçant les exemples ci-dessus par quelque chose comme ceci:

 public string foo(string a) 
    { 
     String b = ""; 
     try 
     { 
      b = "banana"; 
     } 
     catch 
     { 

     } 

     return b; 
    } 
} 

Correction de tous mes problèmes. J'espère que cela peut aider quelqu'un dans le futur. En savoir plus ...

1

Ce code ne doit pas compiler, j'essayé, et lui a donné moi une erreur de compilation "Erreur 3 Utilisation de la variable locale non affectée 'b'"

Quelque chose ne va pas avec votre compilateur, qu'est-ce que vous utilisez?

static public string foo(string a) 
    { 
     String b; 
     try 
     { 
      b = "banana"; 
     } 
     catch 
     { 

     } 

     return b; 
    } 
1

Il ne compilerait pas jusqu'à ce que vous réécriviez l'excaption. Considérez ce qui suit:

public String foo(String a) { 
    String b; 

    try { 
     b="banana:"; 
    } 
    catch { 
     throw; 
    } 

    return b; 
} 

Ce code serait compilé, car s'il y avait une exception, il le relance. Le compilateur prédit les problèmes logiques comme le code inaccessible (bien que le code inaccessible ne soit pas une erreur). Équivalence dans VB.net:

Public Function foo(a As String) As String 
    Dim b As String 

    Try 
     b = "banana:" 
    Catch ex As Exception 
     Throw ex 
    End Try 

    Return b 
End Function 

Par ailleurs, attraper une exception était considéré comme une mauvaise pratique de codage.