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 Koneksi ivity (ODBC) atau kelas MFC untuk Objek Akses Data (DAO). Materi khusus untuk satu atau model lainnya ditandai secara eksplisit. Topik meliputi:
Pendekatan untuk Penanganan Pengecualian
Pendekatannya sama apakah Anda bekerja dengan DAO (usang) atau ODBC.
Anda harus selalu menulis penangan pengecualian untuk menangani kondisi yang luar 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 output jejak untuk melihat pengecualian apa yang dilemparkan, atau periksa informasi kesalahan yang dikembalikan dalam 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 mengembalikan kode yang ditentukan oleh kerangka kerja, yang memiliki nama formulir 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 kerangka kerja maupun yang ditentukan ODBC — bahwa kelas database dapat kembali didokumentasikan di bawah anggota data kelas CDBException
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 penanganan pengecualian database
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 terbuka dapat melemparkan pengecualian (jenis CDBException untuk kelas ODBC), sehingga kode ini memetakan Open
panggilan dengan try
blok. 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 ketika melempar pengecualian.
Untuk diskusi tentang informasi kesalahan yang CDaoException
dikembalikan oleh objek, lihat kelas CDaoException dan CDaoErrorInfo.
Ketika 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 kali melalui perulangan, panggil CDaoException::GetErrorInfo untuk mengisi m_pErrorInfo
ulang anggota data.