Bagikan melalui


Pengecualian: Pengecualian Database

Artikel ini menjelaskan cara menangani pengecualian database. Sebagian besar materi dalam artikel ini berlaku apakah Anda bekerja dengan kelas MFC untuk Open Database Connectivity (ODBC) atau kelas MFC untuk Objek Akses Data (DAO). Materi yang khusus untuk salah satu model atau model lainnya ditandai secara eksplisit. Topik meliputi:

Pendekatan untuk Penanganan Pengecualian

Pendekatannya sama, baik Anda bekerja dengan DAO (yang sudah tidak digunakan) maupun ODBC.

Anda harus selalu menulis pengolah pengecualian untuk menangani kondisi-kondisi yang tidak biasa.

Pendekatan paling pragmatis untuk menangkap pengecualian database adalah menguji aplikasi Anda dengan skenario pengecualian. Tentukan kemungkinan pengecualian yang mungkin terjadi untuk operasi dalam kode Anda, dan paksa pengecualian terjadi. Kemudian periksa keluaran pelacakan untuk melihat pengecualian apa yang dilemparkan, atau periksa informasi kesalahan yang dikembalikan pada debugger. Ini memungkinkan Anda mengetahui kode pengembalian mana yang akan Anda lihat untuk skenario pengecualian yang Anda gunakan.

Kode Kesalahan yang Digunakan untuk Pengecualian ODBC

Selain kode pengembalian yang ditentukan oleh kerangka, yang memiliki nama dengan format AFX_SQL_ERROR_XXX, beberapa CDBExceptions didasarkan pada kode pengembalian ODBC. Kode pengembalian untuk pengecualian tersebut memiliki nama formulir SQL_ERROR_XXX.

Kode pengembalian — baik yang ditentukan oleh kerangka kerja maupun yang ditentukan oleh ODBC — yang dapat dikembalikan oleh kelas database didokumentasikan di bawah anggota data dari kelas m_nRetCode. Informasi tambahan tentang kode pengembalian yang ditentukan oleh ODBC tersedia di Referensi Pemrogram ODBC.

Kode Kesalahan yang Digunakan untuk Pengecualian DAO

Untuk pengecualian DAO, informasi lebih lanjut biasanya tersedia. Anda dapat mengakses informasi kesalahan melalui tiga anggota data objek CDaoException yang tertangkap:

  • m_pErrorInfo berisi penunjuk ke objek CDaoErrorInfo yang merangkum informasi kesalahan dalam kumpulan objek kesalahan DAO yang terkait dengan database.

  • m_nAfxDaoError berisi kode kesalahan yang diperluas dari kelas MFC DAO. Kode kesalahan ini, yang memiliki nama formulir AFX_DAO_ERROR_XXX, didokumentasikan di bawah anggota data di CDaoException.

  • m_scode berisi OLE SCODE dari DAO, jika berlaku. Namun, Anda jarang perlu bekerja dengan kode kesalahan ini. Biasanya informasi lebih lanjut tersedia di dua anggota data lainnya. Lihat anggota data untuk informasi selengkapnya tentang nilai SCODE.

Informasi tambahan tentang kesalahan DAO, jenis objek Kesalahan DAO, dan koleksi Kesalahan DAO tersedia di bawah kelas CDaoException.

Contoh Database Exception-Handling

Contoh berikut mencoba membuat objek turunan CRecordset pada tumpukan dengan new operator, lalu membuka kumpulan rekaman (untuk sumber data ODBC). Untuk contoh serupa untuk kelas DAO, lihat "Contoh Pengecualian DAO" di bawah ini.

Contoh Pengecualian ODBC

Fungsi anggota Open dapat melemparkan pengecualian (dari jenis CDBException untuk kelas ODBC), sehingga kode ini menjepit pemanggilan Open dengan blok try. Blok berikutnya catch akan menangkap CDBException. Anda dapat memeriksa objek pengecualian itu sendiri, yang disebut e, tetapi dalam hal ini cukup untuk mengetahui bahwa upaya untuk membuat kumpulan rekaman telah gagal. Blok catch menampilkan kotak pesan dan membersihkan dengan menghapus objek kumpulan rekaman.

CRecordset* CMyDatabaseDoc::GetRecordset()
{
   CCourses* pSet = new CCourses(&m_dbCust);
   try
   {
      pSet->Open();
   }
   catch (CDBException* e)
   {
      AfxMessageBox(e->m_strError, MB_ICONEXCLAMATION);
      // Delete the incomplete recordset object
      delete pSet;
      pSet = NULL;
      e->Delete();
   }
   return pSet;
}

Contoh Pengecualian DAO

Contoh DAO mirip dengan contoh untuk ODBC, tetapi Anda biasanya dapat mengambil lebih banyak jenis informasi. Kode berikut juga mencoba membuka kumpulan rekaman. Jika upaya tersebut melemparkan pengecualian, Anda dapat memeriksa anggota data objek pengecualian untuk informasi kesalahan. Seperti contoh ODBC sebelumnya, mungkin cukup untuk mengetahui bahwa upaya untuk membuat kumpulan rekaman gagal.

CDaoRecordset* CMyDaoDatabaseDoc::GetRecordset()
{
   CDaoRecordset* pSet = new CCustSet(&m_db);
   try
   {
      pSet->Open();
   }
   catch (CDaoException* pe)
   {
      AfxMessageBox(pe->m_pErrorInfo->m_strDescription, MB_ICONEXCLAMATION);
      // Delete the incomplete recordset object
      delete pSet;
      pSet = NULL;
      pe->Delete();
   }
   return pSet;
}

Kode ini mendapatkan string pesan kesalahan dari anggota m_pErrorInfo objek pengecualian. MFC mengisi anggota ini saat terjadi pengecualian.

Untuk pembahasan mengenai informasi kesalahan yang dikembalikan oleh objek CDaoException, lihat kelas CDaoException dan CDaoErrorInfo.

Saat Anda bekerja dengan database Microsoft Jet (.mdb), dan dalam kebanyakan kasus ketika Anda bekerja dengan ODBC, hanya akan ada satu objek kesalahan. Dalam kasus yang jarang terjadi ketika Anda menggunakan sumber data ODBC dan ada beberapa kesalahan, Anda dapat mengulangi pengumpulan Kesalahan DAO berdasarkan jumlah kesalahan yang dikembalikan oleh CDaoException::GetErrorCount. Setiap iterasi, panggil CDaoException::GetErrorInfo untuk mengisi kembali anggota data m_pErrorInfo.

Lihat juga

Penanganan Pengecualian