Obsługa wyjątków na poziomie warstwy logiki biznesowej i warstwy dostępu do danych na stronie platformy ASP.NET (C#)

Autor: Scott Mitchell

Pobierz plik PDF

W tym samouczku zobaczymy, jak wyświetlić przyjazny, informacyjny komunikat o błędzie, jeśli wystąpi wyjątek podczas operacji wstawiania, aktualizowania lub usuwania kontrolki sieci Web danych ASP.NET.

Wprowadzenie

Praca z danymi z aplikacji internetowej ASP.NET przy użyciu architektury aplikacji warstwowej obejmuje następujące trzy ogólne kroki:

  1. Określ, jaką metodę warstwy logiki biznesowej należy wywołać i jakie wartości parametrów mają zostać przekazane. Wartości parametrów można kodować, przypisywać programowo lub wprowadzać przez użytkownika.
  2. Wywołaj metodę .
  3. Przetwarzanie wyników. Podczas wywoływania metody BLL, która zwraca dane, może to obejmować powiązanie danych z kontrolką sieci Web danych. W przypadku metod BLL, które modyfikują dane, może to obejmować wykonywanie niektórych akcji na podstawie wartości zwracanej lub bezproblemowo obsługi wszelkich wyjątków, które powstały w kroku 2.

Jak pokazano w poprzednim samouczku, zarówno obiekt ObjectDataSource, jak i kontrolki sieci Web danych zapewniają punkty rozszerzalności dla kroków 1 i 3. Element GridView, na przykład, uruchamia zdarzenie RowUpdating przed przypisaniem wartości pól do kolekcji objectDataSource. Zdarzenie RowUpdated jest wywoływane po zakończeniu operacji objectDataSourceUpdateParameters.

Przeanalizowaliśmy już zdarzenia uruchamiane w kroku 1 i zobaczyliśmy, jak można ich użyć do dostosowywania parametrów wejściowych lub anulowania operacji. W tym samouczku zwrócimy uwagę na zdarzenia, które są uruchamiane po zakończeniu operacji. Dzięki tym programom obsługi zdarzeń po poziomie możemy między innymi określić, czy wystąpił wyjątek podczas operacji i obsłużyć go w sposób bezproblemowy, wyświetlając przyjazny, informacyjny komunikat o błędzie na ekranie, a nie domyślnie na standardowej stronie wyjątku ASP.NET.

Aby zilustrować pracę z tymi zdarzeniami po poziomie, utwórzmy stronę zawierającą listę produktów w edytowalnym elemecie GridView. Podczas aktualizowania produktu, jeśli zostanie zgłoszony wyjątek, nasza strona ASP.NET wyświetli krótki komunikat powyżej kontrolki GridView wyjaśniający, że wystąpił problem. Zaczynamy!

Krok 1. Tworzenie edytowalnego elementu GridView produktów

W poprzednim samouczku utworzyliśmy edytowalny element GridView z zaledwie dwoma polami ProductName i UnitPrice. Wymaga to utworzenia dodatkowego przeciążenia ProductsBLL dla metody klasy UpdateProduct , która akceptowała tylko trzy parametry wejściowe (nazwa produktu, cena jednostkowa i identyfikator) w przeciwieństwie do parametru dla każdego pola produktu. W tym samouczku ponownie przećwiczmy tę technikę, tworząc edytowalny element GridView, który wyświetla nazwę produktu, ilość na jednostkę, cenę jednostkową i jednostki w magazynie, ale umożliwia edycję tylko nazwy, ceny jednostkowej i jednostek w magazynie.

Aby uwzględnić ten scenariusz, potrzebujemy innego przeciążenia UpdateProduct metody, który akceptuje cztery parametry: nazwę produktu, cenę jednostkową, jednostki w magazynie i identyfikator. Dodaj następującą metodę do klasy ProductsBLL:

[System.ComponentModel.DataObjectMethodAttribute(
    System.ComponentModel.DataObjectMethodType.Update, false)]
public bool UpdateProduct(string productName, decimal? unitPrice, short? unitsInStock,
    int productID)
{
    Northwind.ProductsDataTable products = Adapter.GetProductByProductID(productID);
    if (products.Count == 0)
        // no matching record found, return false
        return false;
    Northwind.ProductsRow product = products[0];
    product.ProductName = productName;
    if (unitPrice == null) product.SetUnitPriceNull();
      else product.UnitPrice = unitPrice.Value;
    if (unitsInStock == null) product.SetUnitsInStockNull();
      else product.UnitsInStock = unitsInStock.Value;
    // Update the product record
    int rowsAffected = Adapter.Update(product);
    // Return true if precisely one row was updated, otherwise false
    return rowsAffected == 1;
}

Po zakończeniu tej metody możemy utworzyć stronę ASP.NET, która umożliwia edytowanie tych czterech konkretnych pól produktu. ErrorHandling.aspx Otwórz stronę w folderze EditInsertDelete i dodaj element GridView do strony za pośrednictwem Projektant. Powiąż element GridView z nowym obiektem ObjectDataSource, mapowanie Select() metody na ProductsBLL metodę klasy GetProducts() i Update() metodę na UpdateProduct właśnie utworzone przeciążenie.

Użyj przeciążenia metody UpdateProduct, które akceptuje cztery parametry wejściowe

Rysunek 1. Użyj UpdateProduct przeciążenia metody, które akceptuje cztery parametry wejściowe (kliknij, aby wyświetlić obraz pełnowymiarowy)

Spowoduje to utworzenie obiektu ObjectDataSource z kolekcją z UpdateParameters czterema parametrami i kontrolką GridView z polem dla każdego pola produktu. Deklaratywny znacznik ObjectDataSource przypisuje OldValuesParameterFormatString właściwość , original_{0}która spowoduje wyjątek, ponieważ klasa BLL nie oczekuje przekazania parametru wejściowego o nazwie original_productID . Nie zapomnij całkowicie usunąć tego ustawienia ze składni deklaratywnej (lub ustawić je na wartość domyślną). {0}

Następnie przeanalizuj widok GridView, aby uwzględnić tylko ProductNamepola , QuantityPerUnit, UnitPricei UnitsInStock BoundFields. Możesz również zastosować dowolne formatowanie na poziomie pola, które uważasz za konieczne (na przykład zmienianie HeaderText właściwości).

W poprzednim samouczku przyjrzeliśmy się, jak sformatować pole UnitPrice BoundField jako walutę zarówno w trybie tylko do odczytu, jak i w trybie edycji. Zróbmy to samo tutaj. Pamiętaj, że to wymagane ustawienie właściwości BoundField DataFormatString na {0:c}, jej HtmlEncode właściwość falsena , i na ApplyFormatInEditModetrue, jak pokazano na rysunku 2.

Konfigurowanie pola BoundField UnitPrice do wyświetlania jako waluty

Rysunek 2. Konfigurowanie pola UnitPrice ograniczenia do wyświetlania jako waluty (kliknij, aby wyświetlić obraz pełnowymiarowy)

UnitPrice Formatowanie jako waluty w interfejsie edycji wymaga utworzenia procedury obsługi zdarzeń dla zdarzenia GridViewRowUpdating, które analizuje ciąg sformatowany w walucie decimal na wartość. Pamiętaj, że RowUpdating procedura obsługi zdarzeń z ostatniego samouczka została również sprawdzona, aby upewnić się, że użytkownik podał UnitPrice wartość. Jednak w tym samouczku pozwólmy użytkownikowi pominąć cenę.

protected void GridView1_RowUpdating(object sender, GridViewUpdateEventArgs e)
{
    if (e.NewValues["UnitPrice"] != null)
        e.NewValues["UnitPrice"] =decimal.Parse(e.NewValues["UnitPrice"].ToString(),
            System.Globalization.NumberStyles.Currency);
}

Nasz element GridView zawiera element QuantityPerUnit BoundField, ale to pole powiązane powinno być przeznaczone tylko do celów wyświetlania i nie powinno być edytowalne przez użytkownika. Aby to rozmieścić, wystarczy ustawić właściwość BoundFields ReadOnly na true.

Ustaw element QuantityPerUnit BoundField tylko do odczytu

Rysunek 3. Ustaw QuantityPerUnit Read-Only BoundField (Kliknij, aby wyświetlić obraz pełnowymiarowy)

Na koniec zaznacz pole wyboru Włącz edytowanie z tagu inteligentnego GridView. Po wykonaniu tych kroków ErrorHandling.aspx Projektant strony powinny wyglądać podobnie do rysunku 4.

Usuń pole wyboru All But the Needed BoundFields i zaznacz pole wyboru Włącz edycję

Rysunek 4. Usuń wszystko, ale wymagane pola ograniczenia i zaznacz pole wyboru Włącz edycję (kliknij, aby wyświetlić obraz pełnowymiarowy)

W tym momencie mamy listę wszystkich produktów ProductName, QuantityPerUnit, UnitPricei UnitsInStock pól, jednak można edytować tylko ProductNamepola , UnitPricei UnitsInStock .

Użytkownicy mogą teraz łatwo edytować nazwy, ceny i jednostki produktów w polach zapasów

Rysunek 5. Użytkownicy mogą teraz łatwo edytować nazwy, ceny i jednostki w polach zapasów (kliknij, aby wyświetlić obraz pełnowymiarowy)

Krok 2. Bezproblemowa obsługa wyjątków DAL-Level

Podczas gdy nasz edytowalny element GridView działa cudownie, gdy użytkownicy wprowadzają wartości prawne dla nazwy, ceny i jednostek edytowanego produktu w magazynie, wprowadzanie nielegalnych wartości powoduje wyjątek. Na przykład pominięcie ProductName wartości powoduje zgłoszenie noNullAllowedException , ponieważ ProductName właściwość w ProductsRow klasie ma AllowDBNull ustawioną falsewłaściwość na ; jeśli baza danych nie działa, SqlException podczas próby nawiązania połączenia z bazą danych zostanie zgłoszony przez klasę TableAdapter. Bez podejmowania żadnych akcji te wyjątki są bąbelkowe z warstwy dostępu do danych do warstwy logiki biznesowej, a następnie do strony ASP.NET, a na końcu do środowiska uruchomieniowego ASP.NET.

W zależności od tego, jak aplikacja internetowa jest skonfigurowana i czy odwiedzasz aplikację z localhostwitryny , nieobsługiwany wyjątek może spowodować wyświetlenie ogólnej strony błędu serwera, szczegółowego raportu o błędach lub przyjaznej dla użytkownika strony internetowej. Zobacz Obsługa błędów aplikacji internetowej w ASP.NET i element customErrors , aby uzyskać więcej informacji na temat sposobu reagowania środowiska uruchomieniowego ASP.NET na nieumyślny wyjątek.

Rysunek 6 przedstawia ekran napotkany podczas próby zaktualizowania produktu bez określania ProductName wartości. Jest to domyślny szczegółowy raport o błędach wyświetlany podczas przechodzenia przez program localhost.

Pominięcie nazwy produktu spowoduje wyświetlenie szczegółów wyjątku

Rysunek 6. Pominięcie nazwy produktu spowoduje wyświetlenie szczegółów wyjątku (kliknij, aby wyświetlić obraz pełnowymiarowy)

Chociaż takie szczegóły wyjątku są przydatne podczas testowania aplikacji, prezentowanie użytkownika końcowego z takim ekranem w obliczu wyjątku jest mniejsze niż idealne. Użytkownik końcowy prawdopodobnie nie wie, co NoNullAllowedException to jest lub dlaczego został spowodowany. Lepszym rozwiązaniem jest przedstawienie użytkownikowi bardziej przyjaznego dla użytkownika komunikatu wyjaśniającego, że wystąpiły problemy podczas próby zaktualizowania produktu.

Jeśli wystąpi wyjątek podczas wykonywania operacji, zdarzenia po poziomie zarówno w obiekcie ObjectDataSource, jak i kontrolce sieci Web danych zapewniają metodę wykrywania i anulowania wyjątku od bubbling do środowiska uruchomieniowego ASP.NET. W naszym przykładzie utwórzmy procedurę obsługi zdarzeń dla zdarzenia GridView RowUpdated , które określa, czy wyjątek został wyzwolony, a jeśli tak, wyświetla szczegóły wyjątku w kontrolce Sieci Web etykiet.

Zacznij od dodania etykiety do strony ASP.NET, ustawienie jej ID właściwości na ExceptionDetails i wyczyszczenie jej Text właściwości. Aby narysować oko użytkownika na ten komunikat, ustaw jego CssClass właściwość na Warning, która jest klasą CSS dodaną do Styles.css pliku w poprzednim samouczku. Pamiętaj, że ta klasa CSS powoduje wyświetlanie tekstu etykiety w czerwonej, kursywie, pogrubionej, dodatkowej dużej czcionki.

Dodawanie kontrolki sieci Web etykiety do strony

Rysunek 7. Dodawanie kontrolki sieci Web etykiety do strony (kliknij, aby wyświetlić obraz pełnowymiarowy)

Ponieważ chcemy, aby ta kontrolka Sieci Web etykiet był widoczna tylko natychmiast po wystąpieniu wyjątku, ustaw jej Visible właściwość na wartość false w procedurze obsługi zdarzeń Page_Load :

protected void Page_Load(object sender, EventArgs e)
{
    ExceptionDetails.Visible = false;
}

W przypadku tego kodu podczas pierwszej wizyty na pierwszej stronie i kolejnych wycofań ExceptionDetails kontrolka będzie miała właściwość Visible ustawioną na falsewartość . W obliczu wyjątku na poziomie DAL lub BLL, który możemy wykryć w procedurze obsługi zdarzeń GridView RowUpdated , ustawimy ExceptionDetails właściwość kontrolki Visible na true. Ponieważ programy obsługi zdarzeń kontroli sieci Web występują po Page_Load obsłudze zdarzeń w cyklu życia strony, etykieta zostanie wyświetlona. Jednak w następnym poście zwrotnym Page_Load program obsługi zdarzeń przywróci Visible właściwość do false, ukrywając ją ponownie przed widokiem.

Uwaga

Alternatywnie możemy usunąć konieczność ustawienia ExceptionDetails właściwości kontrolki Visible w Page_Load programie, przypisując jej Visible właściwość w składni deklaratywnej i wyłączając jej stan widoku (ustawiając EnableViewState jej właściwość false na false). Użyjemy tego alternatywnego podejścia w przyszłym samouczku.

Po dodaniu kontrolki Etykieta następnym krokiem jest utworzenie procedury obsługi zdarzeń dla zdarzenia GridView RowUpdated . Wybierz element GridView w Projektant, przejdź do okno Właściwości, a następnie kliknij ikonę błyskawicy, wyświetlając listę zdarzeń elementu GridView. Dla zdarzenia GridView RowUpdating powinien już istnieć wpis, ponieważ utworzyliśmy procedurę obsługi zdarzeń dla tego zdarzenia wcześniej w tym samouczku. Utwórz również procedurę obsługi zdarzeń RowUpdated dla zdarzenia.

Tworzenie procedury obsługi zdarzeń dla zdarzenia RowUpdated elementu GridView

Rysunek 8. Tworzenie procedury obsługi zdarzeń dla zdarzenia GridView RowUpdated

Uwaga

Program obsługi zdarzeń można również utworzyć za pomocą list rozwijanych w górnej części pliku klasy za kodem. Wybierz pozycję GridView z listy rozwijanej po lewej stronie i RowUpdated zdarzenie po prawej stronie.

Utworzenie tej procedury obsługi zdarzeń spowoduje dodanie następującego kodu do klasy za pomocą kodu strony ASP.NET:

protected void GridView1_RowUpdated(object sender, GridViewUpdatedEventArgs e)
{
}

Drugi parametr wejściowy tego programu obsługi zdarzeń jest obiektem typu GridViewUpdatedEventArgs, który ma trzy właściwości interesujące dla obsługi wyjątków:

  • Exception odwołanie do zgłaszanego wyjątku; jeśli nie zgłoszono wyjątku, ta właściwość będzie miała wartość null
  • ExceptionHandled wartość logiczna wskazująca, czy wyjątek został obsłużony w RowUpdated procedurze obsługi zdarzeń; jeśli false (wartość domyślna), wyjątek jest ponownie zgłaszany, powtarzając do środowiska uruchomieniowego ASP.NET
  • KeepInEditMode jeśli jest ustawiony true na edytowany wiersz GridView pozostaje w trybie edycji; jeśli false (wartość domyślna), wiersz GridView zostanie przywrócony do trybu tylko do odczytu

Nasz kod powinien sprawdzić, czy Exception nie nullma wartości , co oznacza, że podczas wykonywania operacji został zgłoszony wyjątek. Jeśli tak jest, chcemy:

  • Wyświetlanie komunikatu przyjaznego dla użytkownika w etykiecie ExceptionDetails
  • Wskazuje, że wyjątek został obsłużony
  • Zachowaj wiersz GridView w trybie edycji

Ten następujący kod realizuje następujące cele:

protected void GridView1_RowUpdated(object sender, GridViewUpdatedEventArgs e)
{
    if (e.Exception != null)
    {
        // Display a user-friendly message
        ExceptionDetails.Visible = true;
        ExceptionDetails.Text = "There was a problem updating the product. ";
        if (e.Exception.InnerException != null)
        {
            Exception inner = e.Exception.InnerException;
            if (inner is System.Data.Common.DbException)
                ExceptionDetails.Text +=
                    "Our database is currently experiencing problems." +
                    "Please try again later.";
            else if (inner is NoNullAllowedException)
                ExceptionDetails.Text +=
                    "There are one or more required fields that are missing.";
            else if (inner is ArgumentException)
            {
                string paramName = ((ArgumentException)inner).ParamName;
                ExceptionDetails.Text +=
                    string.Concat("The ", paramName, " value is illegal.");
            }
            else if (inner is ApplicationException)
                ExceptionDetails.Text += inner.Message;
        }
        // Indicate that the exception has been handled
        e.ExceptionHandled = true;
        // Keep the row in edit mode
        e.KeepInEditMode = true;
    }
}

Ta procedura obsługi zdarzeń rozpoczyna się od sprawdzenia, czy e.Exception jest to null. Jeśli tak nie jest, ExceptionDetails właściwość Etykieta Visible jest ustawiona na true , a jej Text właściwość ma wartość "Wystąpił problem podczas aktualizowania produktu". Szczegóły rzeczywistego wyjątku, który został zgłoszony, znajdują się we e.Exception właściwości obiektu InnerException . Ten wewnętrzny wyjątek jest badany i, jeśli jest to określony typ, dodatkowy, pomocny komunikat jest dołączany do ExceptionDetails właściwości Etykieta Text . ExceptionHandled Na koniec właściwości i KeepInEditMode są ustawione na truewartość .

Rysunek 9 przedstawia zrzut ekranu tej strony podczas pomijania nazwy produktu; Rysunek 10 przedstawia wyniki podczas wprowadzania niedozwolonej UnitPrice wartości (-50).

Pole powiązane ProductName musi zawierać wartość

Rysunek 9. Pole ProductName powiązane musi zawierać wartość (kliknij, aby wyświetlić obraz pełnowymiarowy)

Ujemne wartości UnitPrice są niedozwolone

Rysunek 10. Wartości ujemne UnitPrice są niedozwolone (kliknij, aby wyświetlić obraz pełnowymiarowy)

Ustawiając e.ExceptionHandled właściwość na true, RowUpdated program obsługi zdarzeń wskazał, że obsłużył wyjątek. W związku z tym wyjątek nie będzie propagowany do środowiska uruchomieniowego ASP.NET.

Uwaga

Na rysunkach 9 i 10 przedstawiono bezproblemowy sposób obsługi wyjątków zgłoszonych z powodu nieprawidłowych danych wejściowych użytkownika. Najlepiej jednak, aby takie nieprawidłowe dane wejściowe nigdy nie dotarły do warstwy logiki biznesowej, ponieważ strona ASP.NET powinna upewnić się, że dane wejściowe użytkownika są prawidłowe przed wywołaniem ProductsBLL metody klasy UpdateProduct . W następnym samouczku zobaczymy, jak dodać kontrolki weryfikacji do interfejsów edycji i wstawiania, aby upewnić się, że dane przesłane do warstwy logiki biznesowej są zgodne z regułami biznesowymi. Kontrolki sprawdzania poprawności nie tylko uniemożliwiają wywołanie UpdateProduct metody, dopóki dane dostarczone przez użytkownika nie będą prawidłowe, ale także zapewniają bardziej informacyjne środowisko użytkownika do identyfikowania problemów z wprowadzaniem danych.

Krok 3. Bezproblemowa obsługa wyjątków BLL-Level

Podczas wstawiania, aktualizowania lub usuwania danych warstwa dostępu do danych może zgłosić wyjątek w obliczu błędu związanego z danymi. Baza danych może być w trybie offline, wymagana kolumna tabeli bazy danych może nie mieć określonej wartości lub ograniczenie na poziomie tabeli mogło zostać naruszone. Oprócz ściśle powiązanych z danymi wyjątków warstwa logiki biznesowej może używać wyjątków, aby wskazać, kiedy reguły biznesowe zostały naruszone. Na przykład w samouczku Tworzenie warstwy logiki biznesowej dodaliśmy sprawdzanie reguły biznesowej do oryginalnego UpdateProduct przeciążenia. W szczególności, jeśli użytkownik oznaczył produkt jako wycofany, wymagamy, aby produkt nie był jedynym dostarczonym przez dostawcę. Jeśli ten warunek został naruszony, ApplicationException został zgłoszony.

W przypadku przeciążenia utworzonego UpdateProduct w tym samouczku dodajmy regułę biznesową, która uniemożliwia UnitPrice ustawienie pola na nową wartość, która przekracza dwa razy oryginalną UnitPrice wartość. Aby to osiągnąć, dostosuj UpdateProduct przeciążenie, aby wykonało to sprawdzanie i zgłasza ApplicationException błąd, jeśli reguła zostanie naruszona. Zaktualizowana metoda jest następująca:

public bool UpdateProduct(string productName, decimal? unitPrice, short? unitsInStock,
    int productID)
{
    Northwind.ProductsDataTable products = Adapter.GetProductByProductID(productID);
    if (products.Count == 0)
        // no matching record found, return false
        return false;
    Northwind.ProductsRow product = products[0];
    // Make sure the price has not more than doubled
    if (unitPrice != null && !product.IsUnitPriceNull())
        if (unitPrice > product.UnitPrice * 2)
          throw new ApplicationException(
            "When updating a product price," +
            " the new price cannot exceed twice the original price.");
    product.ProductName = productName;
    if (unitPrice == null) product.SetUnitPriceNull();
      else product.UnitPrice = unitPrice.Value;
    if (unitsInStock == null) product.SetUnitsInStockNull();
      else product.UnitsInStock = unitsInStock.Value;
    // Update the product record
    int rowsAffected = Adapter.Update(product);
    // Return true if precisely one row was updated, otherwise false
    return rowsAffected == 1;
}

Dzięki tej zmianie każda aktualizacja cen, która jest większa niż dwa razy, istniejąca cena spowoduje ApplicationException zgłoszenie. Podobnie jak w przypadku wyjątku zgłoszonego z dal, można wykryć i obsłużyć tę ApplicationException obsługę w procedurze obsługi zdarzeń usługi GridView RowUpdated . W rzeczywistości kod programu obsługi zdarzeń, zgodnie z RowUpdated zapisem, poprawnie wykryje ten wyjątek i wyświetli ApplicationExceptionwartość właściwości .Message Rysunek 11 przedstawia zrzut ekranu, gdy użytkownik próbuje zaktualizować cenę Chai do 50,00 USD, czyli ponad dwukrotnie większą niż bieżącą cenę 19,95 USD.

Reguły biznesowe nie zezwalają na wzrost cen, co więcej niż dwukrotnie ceny produktu

Rysunek 11. Reguły biznesowe nie zezwalają na wzrost cen więcej niż dwukrotnie ceny produktu (kliknij, aby wyświetlić obraz pełnowymiarowy)

Uwaga

Najlepiej, aby nasze reguły logiki biznesowej zostałyby refaktoryzowane z UpdateProduct przeciążeń metody i do wspólnej metody. Pozostawiono to jako ćwiczenie dla czytelnika.

Podsumowanie

Podczas wstawiania, aktualizowania i usuwania operacji zarówno kontrolka sieci Web danych, jak i obiekt ObjectDataSource obejmowały wyzwolenie zdarzeń wstępnych i po poziomie, które rezerwują rzeczywistą operację. Jak pokazano w tym samouczku i poprzednim, podczas pracy z edytowalnym elementem GridView wyzwalane jest zdarzenie GridView RowUpdating , a następnie zdarzenie ObjectDataSource Updating , w którym to momencie polecenie aktualizacji jest wykonywane do bazowego obiektu ObjectDataSource. Po zakończeniu operacji zdarzenie ObjectDataSource Updated zostanie wyzwolone, a następnie zdarzenie GridView RowUpdated .

Możemy utworzyć programy obsługi zdarzeń dla zdarzeń wstępnych w celu dostosowania parametrów wejściowych lub zdarzeń po poziomie w celu sprawdzenia i reagowania na wyniki operacji. Programy obsługi zdarzeń po poziomie są najczęściej używane do wykrywania, czy wystąpił wyjątek podczas operacji. W obliczu wyjątku te programy obsługi zdarzeń po poziomie mogą opcjonalnie obsługiwać wyjątek samodzielnie. W tym samouczku pokazano, jak obsłużyć taki wyjątek, wyświetlając przyjazny komunikat o błędzie.

W następnym samouczku zobaczymy, jak zmniejszyć prawdopodobieństwo wyjątków wynikających z problemów z formatowaniem danych (na przykład wprowadzenie ujemnego UnitPrice). W szczególności przyjrzymy się sposobom dodawania kontrolek walidacji do interfejsów edycji i wstawiania.

Szczęśliwe programowanie!

Informacje o autorze

Scott Mitchell, autor siedmiu książek ASP/ASP.NET i założyciel 4GuysFromRolla.com, współpracuje z technologiami internetowymi firmy Microsoft od 1998 roku. Scott pracuje jako niezależny konsultant, trener i pisarz. Jego najnowsza książka to Sams Teach Yourself ASP.NET 2.0 w ciągu 24 godzin. Można do niego dotrzeć pod adresem mitchell@4GuysFromRolla.com. Lub za pośrednictwem swojego bloga, który można znaleźć na stronie http://ScottOnWriting.NET.

Specjalne podziękowania

Ta seria samouczków została sprawdzona przez wielu pomocnych recenzentów. Główny recenzent tego samouczka to Liz Shulok. Chcesz przejrzeć nadchodzące artykuły MSDN? Jeśli tak, upuść mi wiersz pod adresem mitchell@4GuysFromRolla.com.