Obsługa wyjątków przy połączeniu z bazą danych

Obsługa wyjątków przy połączeniu z bazą danych
BU
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 297
0

Witajcie,
Walczę z połączeniem z bazą danych. Jak poprawnie obsłużyć wyjątek z błędem połączenia?? Mam taki kod, który jesdt podpięty pod zdarzenie OnClick TButton:

Kopiuj
procedure TForm4.TestConnection(Sender: TObject);
begin
  db.dbConn.Connected := False;
  db.dbConn.ConnectionString := 'Provider=SQLOLEDB.1;Password='+cs1SqlPassEdit.Text+';Persist Security Info=True;User ID='+cs1SqlUserEdit.Text+';Initial Catalog='+cs1SqlDbEdit.Text+';Data Source='+cs1SqlsrvEdit.Text;
  try
    try
      db.dbConn.Connected := True;
    finally
      ShowMessage('!');
    end;
  except on E: Exception do
    ShowMessage(E.Message);
  end;
end;

Generalnie kod działa. Wywala błąd, gdy coś nie tak z połączeniem. Ale jak obsłużyć sukces połączenia?

flowCRANE
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Tuchów
  • Postów: 12270
0

Zakładając, że ta linijka może rzucić wyjątek:

Kopiuj
db.dbConn.Connected := True;

za sukces należy uznać po prostu jej wykonanie się bez rzuconego wyjątku. A skoro tak, to sukces masz tam gdzie komentarz:

Kopiuj
procedure TForm4.TestConnection(Sender: TObject);
begin
  db.dbConn.Connected := False;
  db.dbConn.ConnectionString := 'Provider=SQLOLEDB.1;Password='+cs1SqlPassEdit.Text+';Persist Security Info=True;User ID='+cs1SqlUserEdit.Text+';Initial Catalog='+cs1SqlDbEdit.Text+';Data Source='+cs1SqlsrvEdit.Text;
  try
    db.dbConn.Connected := True;
    // tutaj wiadomo, że wyjątek nie został rzucony, więc sukces.
  except on E: Exception do
    ShowMessage(E.Message);
  end;
end;
BU
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 297
0

Właśnie sam na to wpadłem. Heh.

flowCRANE
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Tuchów
  • Postów: 12270
1

W normalnych czasach, czyli bardzo dawno temu, to się nikt nad takimi rzeczami nie zastanawiał — ot wywoływało się funkcję i sprawdzało jej rezultat. Jeśli wystąpił błąd, to funkcja zwracała kod błędu, albo zwracała boola, a kod błędu pobierało się wołając jakiś GetLastError. Przepływ sterowania był banalny do kontrolowania, obsługa błędów trywialna do napisania.

A potem wymyślono g**no zwane wyjątkami. Nie można normalnie napisać obsługi błędów, bo nigdy nie wiadomo czy dana instrukcja może rzucić wyjątkiem czy nie, bez sprawdzenia jej implementacji. Kwintesencja OOP — czyli wziąć prosty problem i go zepsuć, tak aby utrudnić pracę, udając, że abstrakcje to wygoda. 🤣

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.