การจัดการข้อยกเว้นใน ASP.NET มีสามลักษณะ:
การติดตาม - ติดตามการทำงานของโปรแกรมในระดับเพจหรือระดับแอปพลิเคชัน
การจัดการข้อผิดพลาด - จัดการข้อผิดพลาดมาตรฐานหรือข้อผิดพลาดแบบกำหนดเองที่ระดับหน้าหรือแอปพลิเคชัน
การดีบัก - เลื่อนผ่านโปรแกรมและตั้งค่าเบรกพอยต์เพื่อวิเคราะห์โค้ด
ในบทนี้ เราจะพูดถึงการติดตามและการจัดการ และในบทนี้ เราจะกล่าวถึงการดีบัก
เพื่อให้เข้าใจแนวคิด ให้สร้างแอปพลิเคชันตัวอย่างต่อไปนี้ มีตัวควบคุมป้ายกำกับ รายการแบบเลื่อนลง และลิงก์ รายการแบบเลื่อนลงจะโหลดอาร์เรย์ของคำพูด และใบเสนอราคาที่เลือกจะแสดงในป้ายกำกับด้านล่าง นอกจากนี้ยังมีไฮเปอร์ลิงก์ที่ชี้ไปยังลิงก์ที่ไม่มีอยู่ด้วย
<%@ ภาษาเพจ = "C#" AutoEventWireup = "true" CodeBehind = "Default.aspx.cs" สืบทอด = "errorhandling._Default" %><! DOCTYPE html PUBLIC "-// W3C//DTD XHTML 1.0 Transitional// TH" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml" > <head runat="server"> <title> การติดตาม การดีบัก และการจัดการข้อผิดพลาด </title> </head> <body> <form id= "form1" runat="server"> <div> <asp:Label ID="lblheading" runat="server" Text="การติดตาม การดีบัก และการจัดการข้อผิดพลาด"> </asp:Label> <br /> <br / > <asp:DropDownList ID="ddlquotes" runat="server" AutoPostBack="True" onselectedindexchanged="ddlquotes_SelectedIndexChanged"> </asp:DropDownList> <br /> <br /> <asp:Label ID="lblquotes" runat= "เซิร์ฟเวอร์"> </asp:ฉลาก> <br /> <br /> <asp:HyperLink ID="HyperLink1" runat="เซิร์ฟเวอร์" NavigateUrl="mylink.htm">ลิงก์ไปยัง:</asp:HyperLink> </div> </form> </body></html>
รหัสหลังไฟล์:
คลาสสาธารณะบางส่วน _Default : System.Web.UI.Page{ protected void Page_Load(ผู้ส่งอ็อบเจ็กต์, EventArgs e) { if (!IsPostBack) { string[,] quotes = { {"จินตนาการสำคัญกว่าความรู้", "Albert Einsten"}, {"สมมติว่าคุณมีคุณธรรม ถ้าคุณไม่มี" "เชคสเปียร์"}, {"ผู้ชายจะสบายใจไม่ได้หากไม่ได้รับความเห็นชอบจากตัวเขาเอง", "Mark Twain"}, {"ระวังหมอหนุ่มและช่างตัดผมเก่า", "เบนจามิน แฟรงคลิน"}, {"สิ่งใดที่เริ่มต้นจากความโกรธ ย่อมจบลงด้วยความอับอาย", "เบนจามิน แฟรงคลิน"} }; ); i++) ddlquotes.Items.Add(new ListItem(quotes[i,0], quotes[i,1])); ddlquotes_SelectedIndexChanged(ผู้ส่งอ็อบเจ็กต์, EventArgs e) { if (ddlquotes.SelectedIndex != -1) { lblquotes.Text = String.Format("{0}, Quote: {1}", ddlquotes.SelectedItem.Text, ddlquotes.SelectedValue) ; } }}
หากต้องการอนุญาตการติดตามระดับเพจ คุณต้องแก้ไขคำสั่งเพจและเพิ่มแอตทริบิวต์ Trace ดังนี้:
<%@ ภาษาเพจ = "C#" AutoEventWireup = "true" CodeBehind = "Default.aspx.cs" สืบทอด = "errorhandling._Default" ติดตาม = "true" %>
ตอนนี้เมื่อคุณรันไฟล์ คุณจะได้รับข้อมูลการติดตาม:
โดยให้ข้อมูลต่อไปนี้ในส่วนหัว:
รหัสเซสชัน
รหัสสถานะ
เวลาของการร้องขอ
ประเภทคำขอ
การเข้ารหัสคำขอและการตอบกลับ
แต่ละครั้งที่มีการร้องขอเพจ รหัสสถานะที่ส่งจากเซิร์ฟเวอร์จะแสดงชื่อและเวลาที่เกิดข้อผิดพลาด หากมี ตารางต่อไปนี้แสดงรหัสสถานะ HTTP ทั่วไป:
ตัวเลข | อธิบาย |
---|---|
การแจ้งเตือน(100 - 199) | |
100 | ดำเนินการต่อ |
101 | ข้อตกลงการแปลง |
ความสำเร็จ(200 - 299) | |
200 | ตกลง |
204 | ไม่มีเนื้อหา |
เปลี่ยนเส้นทาง (300 - 399) | |
301 | ย้ายอย่างถาวร |
305 | ใช้พร็อกซี |
307 | เปลี่ยนเส้นทางชั่วคราว |
ข้อผิดพลาดจากไคลเอ็นต์ (400 - 499) | |
400 | คำขอไม่ถูกต้อง |
402 | ข้อกำหนดการชำระเงิน |
404 | ไม่พบ |
408 | ขอหมดเวลา |
417 | คาดว่าจะล้มเหลว |
ข้อผิดพลาดจากเซิร์ฟเวอร์ (500 - 599) | |
500 | ข้อผิดพลาดเซิร์ฟเวอร์ภายใน |
503 | บริการไม่พร้อมใช้งาน |
505 | ไม่รองรับเวอร์ชัน HTTP |
ภายใต้ข้อมูลระดับบนสุด จะมีบันทึกการติดตามซึ่งให้รายละเอียดเกี่ยวกับวงจรชีวิตของเพจ โดยระบุเวลาที่ผ่านไปในหน่วยวินาทีนับตั้งแต่เริ่มต้นเพจ
ส่วนถัดไปคือแผนผังการควบคุม ซึ่งแสดงรายการการควบคุมทั้งหมดบนเพจในรูปแบบลำดับชั้น:
การประกาศครั้งล่าสุดในเซสชันและแอปพลิเคชันคือการรวบรวมสรุป คุกกี้ และส่วนหัวตามด้วยตัวแปรเซิร์ฟเวอร์ทั้งหมด
ออบเจ็กต์การติดตามช่วยให้คุณสามารถเพิ่มข้อมูลที่กำหนดเองเพื่อติดตามเอาต์พุตได้ มีวิธีดำเนินการสองวิธี: วิธีเขียน และวิธีเตือน
เปลี่ยนตัวจัดการเหตุการณ์ Page_Load เพื่อตรวจหาวิธีการเขียน:
protected void Page_Load(ผู้ส่งวัตถุ EventArgs e){ Trace.Write("Page Load"); if (!IsPostBack) { Trace.Write("Not Post Back, Page Load"); string[,] quotes = ... ............ }}
วิ่งเพื่อดูผลกระทบ:
ในการตรวจจับเมธอด Warn ให้บังคับรหัสข้อผิดพลาดในตัวจัดการเหตุการณ์ที่เปลี่ยนดัชนีที่เลือก:
ลอง { int a = 0; int b = 9 / a;} จับ (ข้อยกเว้น e) { Trace.Warn ("UserAction", "กำลังประมวลผล 9/a", e);}
Try-Catch เป็นโครงสร้างการเขียนโปรแกรม C# บล็อก try จะเก็บโค้ดใดๆ ที่อาจสร้างหรือไม่สร้างข้อผิดพลาด และบล็อก catch จะจับข้อผิดพลาด เมื่อโปรแกรมทำงาน โปรแกรมจะส่งคำเตือนในบันทึกการติดตาม
การติดตามระดับแอปพลิเคชันใช้กับทุกหน้าในเว็บไซต์ มันถูกนำไปใช้โดยการวางรหัสต่อไปนี้ในไฟล์ web.config:
<system.web> <ติดตามเปิดใช้งาน = "true" /></system.web>
แม้ว่า ASP.NET จะตรวจพบข้อผิดพลาดรันไทม์ทั้งหมด แต่ก็ยังมีข้อผิดพลาดเล็กๆ น้อยๆ ที่ยังคงอยู่ การสังเกตข้อผิดพลาดผ่านการติดตามมีไว้สำหรับนักพัฒนา ไม่ใช่ผู้ใช้
ดังนั้น เพื่อป้องกันไม่ให้สิ่งนี้เกิดขึ้น คุณสามารถเพิ่มการตั้งค่าการแก้ไขข้อผิดพลาดใน web.config ของแอปพลิเคชันของคุณได้ เป็นการแก้ไขข้อผิดพลาดทั่วทั้งแอปพลิเคชัน ตัวอย่างเช่น คุณสามารถเพิ่มรหัสต่อไปนี้ลงในไฟล์ web.config:
<การกำหนดค่า> <system.web> <customErrors mode="RemoteOnly" defaultRedirect = "GenericErrorPage.htm"> <error statusCode = "403" เปลี่ยนเส้นทาง = "NoAccess.htm" /> < error statusCode = "404" เปลี่ยนเส้นทาง = "FileNotFound .htm" /> </customErrors> </system.web><configuration>
คุณลักษณะบางประการที่เป็นไปได้: - **โหมด:** อนุญาตหรือไม่อนุญาตหน้าข้อผิดพลาดที่กำหนดเอง โดยมีค่าที่เป็นไปได้สามค่า: - **เปิด:** แสดงเพจที่กำหนดเอง - **ปิด:** แสดงหน้าข้อผิดพลาด ASP.NET (หน้าสีเหลือง) - **ระยะไกลเท่านั้น:** แสดงข้อผิดพลาดที่กำหนดเองไปยังไคลเอนต์ โดยแสดงข้อผิดพลาด ASP.NET ในเครื่อง - **defaultRedirect:** ประกอบด้วย URL ของเพจที่จะแสดงในกรณีที่เกิดข้อผิดพลาดที่ยังไม่ได้รับการแก้ไข ในการวางหน้าข้อผิดพลาดที่กำหนดเองที่แตกต่างกันสำหรับประเภทข้อผิดพลาดที่แตกต่างกัน จะมีการใช้แท็กย่อย โดยที่หน้าข้อผิดพลาดที่แตกต่างกันจะถูกระบุตามรหัสสถานะของข้อผิดพลาด เพื่อให้บรรลุการแก้ไขข้อผิดพลาดระดับเพจ คุณสามารถแก้ไขคำสั่งเพจเป็น: `````` เนื่องจากการดีบัก ASP.NET เป็นหัวข้อสำคัญภายในนั้น เราจะหารือแยกกันในบทถัดไป