French Gestion d'erreur

Discussion in 'French Forum' started by Beber, Nov 2, 2017.

  1. Beber

    Beber Member

    Bonjour,

    existe-t-il une gestion des erreurs sous B4A ?

    J'écris des données dans une table Sqlite comprenant un index à valeur unique.
    Ainsi, si j'ai un doublon, le code génère, en toute logique, une erreur.
    Je voudrais donc intercepter cette erreur.

    Merci
     
  2. Laurent95

    Laurent95 Active Member Licensed User

    Une réponse tardive, mais une réponse.

    Oui pour gérer les erreurs il faut utiliser
    TRY/CATCH/END TRY

    Mais attention cette gestion remontera toutes les erreurs.
    Donc obligera à réagir pour toute erreur qui surviendrait, et de bien dissocier la réaction, pour chacune si il le faut.
    Une discussion sur le sujet :https://www.b4x.com/android/forum/threads/when-to-use-try-catch-block.56844/

    Un exemple de code qui gère un retour en SQL avec la méthode citée.
    Il est utilisé une tentative d'écriture dans la base SQL et ça gère les erreurs ou le retour sous diverses formes (update d'enregistrement si il existe un enregistrement correspondant aux critères).
    C'est tiré d'une ancienne version de DBUtils (la dernière en date est celle là je pense: https://www.b4x.com/android/forum/threads/b4x-dbutils-2.81280/ ) mais adapté pour mes besoins dans un programme.

    Bien entendu le code appelant gère aussi l'exception retournée si il y a une erreur.
    Le fait de démarrer une transaction n'écrit rien dans la base si il n'y a pas lieu, cela peu donc être utilisé pour tester un identifiant unique en adaptant le code et éviter les doublons plutôt que de gérer une erreur en retour.

    Code:
    'Updates a single field in a record
    'Field is the column name
    ' - "No Error" in case of successfull
    ' - "No record to update" in case of query don't match
    ' - "Error:", with LastException.Message who follows, in case of error
    Sub UpdateRecord(SQL As SQL, TableName As String, Field As String, NewValue As Object, _
       WhereFieldEquals 
    As MapAs String
        
    SQL.BeginTransaction
        
    Try
            
    If WhereFieldEquals.Size = 0 Then
                
    Return "Error:WhereFieldEquals map empty!"
            
    End If
            
    'Build the query
            Dim sb As StringBuilder
            sb.Initialize
            sb.Append(
    "SELECT count(*) FROM ").Append(TableName).Append(" WHERE ")
            
    Dim args() As String
            
    For i = 0 To WhereFieldEquals.Size - 1
                
    If i > 0 Then sb.Append(" AND ")
                sb.Append(
    "[").Append(WhereFieldEquals.GetKeyAt(i)).Append("] = ?")
                args(i) = WhereFieldEquals.GetValueAt(i)
            
    Next
            
    'First search if records exist
            Dim NumberOfRecord As Int
            NumberOfRecord = 
    SQL.ExecQuerySingleResult2(sb.ToString, args)
            
    If NumberOfRecord=0 Then
                
    Return "No record to update"
            
    Else
                sb.Initialize
                sb.Append(
    "UPDATE [").Append(TableName).Append("] SET [").Append(Field).Append("] = ? WHERE ")
                
    Dim args2 As List
                args2.Initialize
                args2.Add(NewValue)
                
    For i = 0 To WhereFieldEquals.Size - 1
                    
    If i > 0 Then sb.Append(" AND ")
                    sb.Append(
    "[").Append(WhereFieldEquals.GetKeyAt(i)).Append("] = ?")
                    args2.Add(WhereFieldEquals.GetValueAt(i))
                
    Next
                
    SQL.ExecNonQuery2(sb.ToString, args)
                
    SQL.TransactionSuccessful
                
    SQL.EndTransaction
                
    Return "No Error"
            
    End If
        
    Catch
            
    Return "Error:" & LastException.Message
        
    End Try
    End Sub
     
  3. Beber

    Beber Member

    Merci.
    En effet, la réponse est tardive et j'ai trouvé (par hasard) la réponse entre temps.
    Par contre, merci pour les explications complètes et l'exemple.
     
  4. Laurent95

    Laurent95 Active Member Licensed User

    De rien.
    J'ai aussi été surpris qu'il n'y ait pas eu de réponse depuis plus d'un mois.
    Mais bon la communauté francophone n'est peut-etre pas trop présente en ces périodes de fêtes.
     
Loading...