French Gestion d'erreur

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
 

Laurent95

Active Member
Licensed User
Longtime User
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

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.

B4X:
'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 Map) As 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
 

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.
 

Laurent95

Active Member
Licensed User
Longtime 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.
 
Top