Bagikan melalui


Menangani Pengecualian Tingkat BLL dan DAL (VB)

oleh Scott Mitchell

Unduh PDF

Dalam tutorial ini, kita akan melihat cara menangani pengecualian yang dimunculkan secara bijaksana selama alur kerja pembaruan DataList yang dapat diedit.

Pendahuluan

Dalam Ringkasan Pengeditan dan Penghapusan Data dalam tutorial DataList , kami membuat DataList yang menawarkan kemampuan pengeditan dan penghapusan sederhana. Meskipun berfungsi penuh, itu hampir tidak ramah pengguna, karena kesalahan apa pun yang terjadi selama proses pengeditan atau penghapusan mengakibatkan pengecualian yang tidak tertangani. Misalnya, menghilangkan nama produk atau, saat mengedit produk, memasukkan nilai harga sangat terjangkau!, memberikan pengecualian. Karena pengecualian ini tidak tertangkap dalam kode, pengecualian ini berdengung hingga runtime ASP.NET, yang kemudian menampilkan detail pengecualian di halaman web.

Seperti yang kita lihat dalam tutorial Menangani Pengecualian BLL dan DAL-Level dalam Halaman ASP.NET , jika pengecualian dinaikkan dari kedalaman Logika Bisnis atau Lapisan Akses Data, detail pengecualian dikembalikan ke ObjectDataSource dan kemudian ke GridView. Kami melihat cara menangani pengecualian ini dengan anggun dengan membuat Updated atau RowUpdated penanganan aktivitas untuk ObjectDataSource atau GridView, memeriksa pengecualian, lalu menunjukkan bahwa pengecualian ditangani.

Namun, tutorial DataList kami tidak menggunakan ObjectDataSource untuk memperbarui dan menghapus data. Sebaliknya, kami bekerja langsung melawan BLL. Untuk mendeteksi pengecualian yang berasal dari BLL atau DAL, kita perlu menerapkan kode penanganan pengecualian dalam kode di belakang halaman ASP.NET kita. Dalam tutorial ini, kita akan melihat cara menangani pengecualian yang dimunculkan secara lebih bijaksana selama alur kerja pembaruan DataList yang dapat diedit.

Catatan

Dalam Ringkasan Pengeditan dan Penghapusan Data dalam tutorial DataList , kami membahas berbagai teknik untuk mengedit dan menghapus data dari DataList, Beberapa teknik yang terlibat menggunakan ObjectDataSource untuk memperbarui dan menghapus. Jika Anda menggunakan teknik ini, Anda dapat menangani pengecualian dari BLL atau DAL melalui ObjectDataSource s Updated atau Deleted penanganan aktivitas.

Langkah 1: Membuat DataList yang Dapat Diedit

Sebelum kita khawatir tentang menangani pengecualian yang terjadi selama alur kerja pembaruan, mari kita terlebih dahulu membuat DataList yang dapat diedit. ErrorHandling.aspx Buka halaman di EditDeleteDataList folder, tambahkan DataList ke Perancang, atur propertinya ID ke Products, dan tambahkan ObjectDataSource baru bernama ProductsDataSource. Konfigurasikan ObjectDataSource untuk menggunakan ProductsBLL metode kelas s GetProducts() untuk memilih rekaman; atur daftar drop-down di tab INSERT, UPDATE, dan DELETE ke (Tidak Ada).

Mengembalikan Informasi Produk Menggunakan Metode GetProducts()

Gambar 1: Mengembalikan Informasi Produk Menggunakan GetProducts() Metode (Klik untuk melihat gambar ukuran penuh)

Setelah menyelesaikan wizard ObjectDataSource, Visual Studio akan secara otomatis membuat ItemTemplate untuk DataList. Ganti ini dengan ItemTemplate yang menampilkan setiap nama dan harga produk dan menyertakan tombol Edit. Selanjutnya, buat EditItemTemplate dengan kontrol Web TextBox untuk nama dan harga dan tombol Perbarui dan Batalkan. Terakhir, atur properti DataList ke RepeatColumns 2.

Setelah perubahan ini, markup deklaratif halaman Anda akan terlihat mirip dengan yang berikut ini. Periksa kembali untuk memastikan bahwa tombol Edit, Batal, dan Perbarui masing-masing mengatur propertinya CommandName ke Edit, Batal, dan Perbarui.

<asp:DataList ID="Products" runat="server" DataKeyField="ProductID"
    DataSourceID="ProductsDataSource" RepeatColumns="2">
    <ItemTemplate>
        <h5>
            <asp:Label runat="server" ID="ProductNameLabel"
                Text='<%# Eval("ProductName") %>' />
        </h5>
        Price:
            <asp:Label runat="server" ID="Label1"
                Text='<%# Eval("UnitPrice", "{0:C}") %>' />
        <br />
            <asp:Button runat="server" id="EditProduct" CommandName="Edit"
                Text="Edit" />
        <br />
        <br />
    </ItemTemplate>
    <EditItemTemplate>
        Product name:
            <asp:TextBox ID="ProductName" runat="server"
                Text='<%# Eval("ProductName") %>' />
        <br />
        Price:
            <asp:TextBox ID="UnitPrice" runat="server"
                Text='<%# Eval("UnitPrice", "{0:C}") %>' />
        <br />
        <br />
            <asp:Button ID="UpdateProduct" runat="server" CommandName="Update"
                Text="Update" /> 
            <asp:Button ID="CancelUpdate" runat="server" CommandName="Cancel"
                Text="Cancel" />
    </EditItemTemplate>
</asp:DataList>
<asp:ObjectDataSource ID="ProductsDataSource" runat="server"
    SelectMethod="GetProducts" TypeName="ProductsBLL"
    OldValuesParameterFormatString="original_{0}">
</asp:ObjectDataSource>

Catatan

Untuk tutorial ini, status tampilan DataList harus diaktifkan.

Luangkan waktu sejenak untuk melihat kemajuan kami melalui browser (lihat Gambar 2).

Setiap Produk Menyertakan Tombol Edit

Gambar 2: Setiap Produk Menyertakan Tombol Edit (Klik untuk melihat gambar ukuran penuh)

Saat ini, tombol Edit hanya menyebabkan postback belum membuat produk dapat diedit. Untuk mengaktifkan pengeditan, kita perlu membuat penanganan aktivitas untuk DataList s EditCommand, CancelCommand, dan UpdateCommand peristiwa. Peristiwa EditCommand dan CancelCommand hanya memperbarui properti DataList dan EditItemIndex menggabungkan kembali data ke DataList:

Protected Sub Products_EditCommand(source As Object, e As DataListCommandEventArgs) _
    Handles Products.EditCommand
    ' Set the DataList's EditItemIndex property to the
    ' index of the DataListItem that was clicked
    Products.EditItemIndex = e.Item.ItemIndex
    ' Rebind the data to the DataList
    Products.DataBind()
End Sub
Protected Sub Products_CancelCommand(source As Object, e As DataListCommandEventArgs) _
    Handles Products.CancelCommand
    ' Set the DataList's EditItemIndex property to -1
    Products.EditItemIndex = -1
    ' Rebind the data to the DataList
    Products.DataBind()
End Sub

Penanganan UpdateCommand aktivitas sedikit lebih terlibat. Ini perlu dibaca dalam produk yang ProductID diedit dari DataKeys koleksi bersama dengan nama produk dan harga dari TextBoxes di EditItemTemplate, dan kemudian memanggil ProductsBLL metode kelas s UpdateProduct sebelum mengembalikan DataList ke status pra-pengeditannya.

Untuk saat ini, mari kita gunakan kode yang sama persis dari UpdateCommand penanganan aktivitas di Gambaran Umum Pengeditan dan Penghapusan Data dalam tutorial DataList . Kami akan menambahkan kode untuk menangani pengecualian dengan anggun di langkah 2.

Protected Sub Products_UpdateCommand(source As Object, e As DataListCommandEventArgs) _
    Handles Products.UpdateCommand
    ' Read in the ProductID from the DataKeys collection
    Dim productID As Integer = Convert.ToInt32(Products.DataKeys(e.Item.ItemIndex))
    ' Read in the product name and price values
    Dim productName As TextBox = CType(e.Item.FindControl("ProductName"), TextBox)
    Dim unitPrice As TextBox = CType(e.Item.FindControl("UnitPrice"), TextBox)
    Dim productNameValue As String = Nothing
    If productName.Text.Trim().Length > 0 Then
        productNameValue = productName.Text.Trim()
    End If
    Dim unitPriceValue As Nullable(Of Decimal) = Nothing
    If unitPrice.Text.Trim().Length > 0 Then
        unitPriceValue = Decimal.Parse(unitPrice.Text.Trim(), _
                         System.Globalization.NumberStyles.Currency)
    End If
    ' Call the ProductsBLL's UpdateProduct method...
    Dim productsAPI As New ProductsBLL()
    productsAPI.UpdateProduct(productNameValue, unitPriceValue, productID)
    ' Revert the DataList back to its pre-editing state
    Products.EditItemIndex = -1
    Products.DataBind()
End Sub

Dalam menghadapi input yang tidak valid yang dapat dalam bentuk harga satuan yang diformat dengan tidak benar, nilai harga satuan ilegal seperti -$5.00, atau kelalaian nama produk pengecualian akan dinaikkan. UpdateCommand Karena penanganan aktivitas tidak menyertakan kode penanganan pengecualian apa pun pada saat ini, pengecualian akan menggelegak hingga runtime ASP.NET, di mana itu akan ditampilkan kepada pengguna akhir (lihat Gambar 3).

Saat Pengecualian Tidak Tertangani Terjadi, Pengguna Akhir Melihat Halaman Kesalahan

Gambar 3: Saat Pengecualian Tidak Tertangani Terjadi, Pengguna Akhir Melihat Halaman Kesalahan

Langkah 2: Menangani Pengecualian dengan Anggun di UpdateCommand Event Handler

Selama alur kerja pembaruan, pengecualian dapat terjadi di UpdateCommand penanganan aktivitas, BLL, atau DAL. Misalnya, jika pengguna memasukkan harga Terlalu mahal, Decimal.Parse pernyataan dalam penanganan UpdateCommand aktivitas akan melemparkan FormatException pengecualian. Jika pengguna menghilangkan nama produk atau jika harga memiliki nilai negatif, DAL akan mengajukan pengecualian.

Ketika pengecualian terjadi, kami ingin menampilkan pesan informatif dalam halaman itu sendiri. Tambahkan kontrol Web Label ke halaman yang ID diatur ke ExceptionDetails. Konfigurasikan teks Label untuk ditampilkan dalam font merah, ekstra besar, tebal, dan miring dengan menetapkan propertinya CssClass ke Warning kelas CSS, yang ditentukan dalam Styles.css file.

Ketika terjadi kesalahan, kami hanya ingin Label ditampilkan sekali. Artinya, pada postback berikutnya, pesan peringatan Label harus hilang. Ini dapat dicapai dengan menghapus properti Text pada Label atau mengatur propertinya Visible ke False dalam handler peristiwa Page_Load (seperti yang kita lakukan sebelumnya dalam tutorial Penanganan Pengecualian BLL dan DAL-Level dalam Halaman ASP.NET) atau dengan menonaktifkan dukungan view state pada Label. Mari kita gunakan opsi terakhir.

<asp:Label ID="ExceptionDetails" EnableViewState="False" CssClass="Warning"
    runat="server" />

Saat pengecualian dimunculkan, kami akan menetapkan detail pengecualian ke ExceptionDetails properti Kontrol Text label. Karena status tampilannya dinonaktifkan, pada postback Text berikutnya, perubahan terprogram properti akan hilang, mengembalikan kembali ke teks default (string kosong), sehingga menyembunyikan pesan peringatan.

Untuk menentukan kapan kesalahan telah dimunculkan untuk menampilkan pesan bermanfaat di halaman, kita perlu menambahkan Try ... Catch blok ke UpdateCommand penanganan aktivitas. Bagian berisi Try kode yang dapat menyebabkan pengecualian, sementara Catch blok berisi kode yang dijalankan dalam menghadapi pengecualian. Lihat bagian Dasar-Dasar Penanganan Pengecualian di dokumentasi .NET Framework untuk informasi selengkapnya tentang Try ... Catch blok.

Protected Sub Products_UpdateCommand(source As Object, e As DataListCommandEventArgs) _
    Handles Products.UpdateCommand
    ' Handle any exceptions raised during the editing process
    Try
        ' Read in the ProductID from the DataKeys collection
        Dim productID As Integer = _
            Convert.ToInt32(Products.DataKeys(e.Item.ItemIndex))
        ... Some code omitted for brevity ...
    Catch ex As Exception
        ' TODO: Display information about the exception in ExceptionDetails
    End Try
End Sub

Ketika pengecualian dari jenis apa pun dilemparkan oleh kode dalam Try blok, Catch kode blok akan mulai dijalankan. Jenis pengecualian yang dilemparkan DbException, , NoNullAllowedExceptionArgumentException, dan sebagainya tergantung pada apa, tepatnya, mengendap kesalahan di tempat pertama. Jika ada masalah di tingkat database, akan DbException dilemparkan. Jika nilai yang tidak valid dimasukkan untuk bidang UnitPrice, UnitsInStock, UnitsOnOrder, atau ReorderLevel, kesalahan ArgumentException akan terjadi, karena kami menambahkan kode untuk memvalidasi nilai-nilai bidang ini di kelas ProductsDataTable (lihat tutorial Membuat Lapisan Logika Bisnis).

Kami dapat memberikan penjelasan yang lebih membantu kepada pengguna akhir dengan mendinginkan teks pesan pada jenis pengecualian yang tertangkap. Kode berikut, yang digunakan dalam bentuk yang hampir identik di tutorial Penanganan Pengecualian BLL dan DAL-Level di Halaman ASP.NET, menyediakan tingkat detail ini:

Private Sub DisplayExceptionDetails(ByVal ex As Exception)
    ' Display a user-friendly message
    ExceptionDetails.Text = "There was a problem updating the product. "
    If TypeOf ex Is System.Data.Common.DbException Then
        ExceptionDetails.Text += "Our database is currently experiencing problems." + _
                                 "Please try again later."
    ElseIf TypeOf ex Is System.Data.NoNullAllowedException Then
        ExceptionDetails.Text+="There are one or more required fields that are missing."
    ElseIf TypeOf ex Is ArgumentException Then
        Dim paramName As String = CType(ex, ArgumentException).ParamName
        ExceptionDetails.Text+=String.Concat("The ", paramName, " value is illegal.")
    ElseIf TypeOf ex Is ApplicationException Then
        ExceptionDetails.Text += ex.Message
    End If
End Sub

Untuk menyelesaikan tutorial ini, cukup panggil DisplayExceptionDetails metode dari blok yang Catch melewati instans yang tertangkap Exception (ex).

Try ... Catch Dengan blok di tempat, pengguna disajikan dengan pesan kesalahan yang lebih informatif, seperti yang ditunjukkan Gambar 4 dan 5. Perhatikan bahwa dalam menghadapi pengecualian, DataList tetap dalam mode edit. Ini karena setelah pengecualian terjadi, alur kontrol segera dialihkan ke Catch blok, melewati kode yang mengembalikan DataList ke status pra-pengeditannya.

Pesan Kesalahan Ditampilkan jika Pengguna Menghilangkan Bidang yang Diperlukan

Gambar 4: Pesan Kesalahan Ditampilkan jika Pengguna Menghilangkan Bidang yang Diperlukan (Klik untuk melihat gambar ukuran penuh)

Pesan Kesalahan Ditampilkan Saat Memasukkan Harga Negatif

Gambar 5: Pesan Kesalahan Ditampilkan Saat Memasukkan Harga Negatif (Klik untuk melihat gambar ukuran penuh)

Ringkasan

GridView dan ObjectDataSource menyediakan penanganan aktivitas pasca-tingkat yang menyertakan informasi tentang pengecualian apa pun yang dimunculkan selama alur kerja pembaruan dan penghapusan, serta properti yang dapat diatur untuk menunjukkan apakah pengecualian telah ditangani atau tidak. Namun, fitur-fitur ini tidak tersedia saat bekerja dengan DataList dan menggunakan BLL secara langsung. Sebaliknya, kami bertanggung jawab untuk menerapkan penanganan pengecualian.

Dalam tutorial ini kita melihat cara menambahkan penanganan pengecualian ke alur kerja pembaruan DataList yang dapat diedit dengan menambahkan Try ... Catch blok ke UpdateCommand penanganan aktivitas. Jika pengecualian dimunculkan selama alur kerja pembaruan, Catch kode blok dijalankan, menampilkan informasi bermanfaat di ExceptionDetails Label.

Pada titik ini, DataList tidak berupaya mencegah pengecualian terjadi di tempat pertama. Meskipun kami tahu bahwa harga negatif akan menghasilkan pengecualian, kami belum menambahkan fungsionalitas apa pun untuk secara proaktif mencegah pengguna memasukkan input yang tidak valid tersebut. Dalam tutorial berikutnya, kita akan melihat cara membantu mengurangi pengecualian yang disebabkan oleh input pengguna yang tidak valid dengan menambahkan kontrol validasi di EditItemTemplate.

Selamat Pemrograman!

Bacaan lebih lanjut

Untuk informasi selengkapnya tentang topik yang dibahas dalam tutorial ini, lihat sumber daya berikut:

Tentang Penulis

Scott Mitchell, penulis tujuh buku ASP/ASP.NET dan pendiri 4GuysFromRolla.com, telah bekerja sama dengan teknologi Microsoft Web sejak 1998. Scott bekerja sebagai konsultan, pelatih, dan penulis independen. Buku terbarunya adalah Sams Teach Yourself ASP.NET 2.0 dalam 24 Jam. Dia dapat dijangkau di mitchell@4GuysFromRolla.com.

Terima kasih khusus untuk

Seri tutorial ini ditinjau oleh banyak peninjau yang bermanfaat. Peninjau prospek untuk tutorial ini adalah Ken Pespisa. Tertarik untuk meninjau artikel MSDN saya yang akan datang? Jika demikian, hubungi saya di mitchell@4GuysFromRolla.com.