Exception.Data Properti
Definisi
Penting
Beberapa informasi terkait produk prarilis yang dapat diubah secara signifikan sebelum dirilis. Microsoft tidak memberikan jaminan, tersirat maupun tersurat, sehubungan dengan informasi yang diberikan di sini.
Mendapatkan kumpulan pasangan kunci/nilai yang memberikan informasi tambahan yang ditentukan pengguna tentang pengecualian.
public:
virtual property System::Collections::IDictionary ^ Data { System::Collections::IDictionary ^ get(); };
public virtual System.Collections.IDictionary Data { get; }
member this.Data : System.Collections.IDictionary
Public Overridable ReadOnly Property Data As IDictionary
Nilai Properti
Objek yang mengimplementasikan IDictionary antarmuka dan berisi kumpulan pasangan kunci/nilai yang ditentukan pengguna. Defaultnya adalah koleksi kosong.
Contoh
Contoh berikut menunjukkan cara menambahkan dan mengambil informasi menggunakan Data properti .
// This example demonstrates the Exception.Data property.
using System;
using System.Collections;
class Sample
{
public static void Main()
{
Console.WriteLine("\nException with some extra information...");
RunTest(false);
Console.WriteLine("\nException with all extra information...");
RunTest(true);
}
public static void RunTest(bool displayDetails)
{
try {
NestedRoutine1(displayDetails);
}
catch (Exception e) {
Console.WriteLine("An exception was thrown.");
Console.WriteLine(e.Message);
if (e.Data.Count > 0) {
Console.WriteLine(" Extra details:");
foreach (DictionaryEntry de in e.Data)
Console.WriteLine(" Key: {0,-20} Value: {1}",
"'" + de.Key.ToString() + "'", de.Value);
}
}
}
public static void NestedRoutine1(bool displayDetails)
{
try {
NestedRoutine2(displayDetails);
}
catch (Exception e) {
e.Data["ExtraInfo"] = "Information from NestedRoutine1.";
e.Data.Add("MoreExtraInfo", "More information from NestedRoutine1.");
throw;
}
}
public static void NestedRoutine2(bool displayDetails)
{
Exception e = new Exception("This statement is the original exception message.");
if (displayDetails) {
string s = "Information from NestedRoutine2.";
int i = -903;
DateTime dt = DateTime.Now;
e.Data.Add("stringInfo", s);
e.Data["IntInfo"] = i;
e.Data["DateTimeInfo"] = dt;
}
throw e;
}
}
// The example displays the following output:
// Exception with some extra information...
// An exception was thrown.
// This statement is the original exception message.
// Extra details:
// Key: 'ExtraInfo' Value: Information from NestedRoutine1.
// Key: 'MoreExtraInfo' Value: More information from NestedRoutine1.
//
// Exception with all extra information...
// An exception was thrown.
// This statement is the original exception message.
// Extra details:
// Key: 'stringInfo' Value: Information from NestedRoutine2.
// Key: 'IntInfo' Value: -903
// Key: 'DateTimeInfo' Value: 7/29/2013 10:50:13 AM
// Key: 'ExtraInfo' Value: Information from NestedRoutine1.
// Key: 'MoreExtraInfo' Value: More information from NestedRoutine1.
// This example demonstrates the Exception.Data property.
open System
open System.Collections
let nestedRoutine2 displayDetails =
let e = Exception "This statement is the original exception message."
if displayDetails then
let s = "Information from nestedRoutine2."
let i = -903
let dt = DateTime.Now
e.Data.Add("stringInfo", s)
e.Data["IntInfo"] <- i
e.Data["DateTimeInfo"] <- dt
raise e
let nestedRoutine1 displayDetails =
try
nestedRoutine2 displayDetails
with e ->
e.Data["ExtraInfo"] <- "Information from nestedRoutine1."
e.Data.Add("MoreExtraInfo", "More information from nestedRoutine1.")
reraise ()
let runTest displayDetails =
try
nestedRoutine1 displayDetails
with e ->
printfn "An exception was thrown."
printfn $"{e.Message}"
if e.Data.Count > 0 then
printfn " Extra details:"
for de in e.Data do
let de = de :?> DictionaryEntry
printfn $""" Key: {"'" + de.Key.ToString() + "'",-20} Value: {de.Value}"""
printfn "\nException with some extra information..."
runTest false
printfn "\nException with all extra information..."
runTest true
// The example displays the following output:
// Exception with some extra information...
// An exception was thrown.
// This statement is the original exception message.
// Extra details:
// Key: 'ExtraInfo' Value: Information from NestedRoutine1.
// Key: 'MoreExtraInfo' Value: More information from NestedRoutine1.
//
// Exception with all extra information...
// An exception was thrown.
// This statement is the original exception message.
// Extra details:
// Key: 'stringInfo' Value: Information from NestedRoutine2.
// Key: 'IntInfo' Value: -903
// Key: 'DateTimeInfo' Value: 7/29/2013 10:50:13 AM
// Key: 'ExtraInfo' Value: Information from NestedRoutine1.
// Key: 'MoreExtraInfo' Value: More information from NestedRoutine1.
Imports System.Collections
Module Example
Public Sub Main()
Console.WriteLine()
Console.WriteLine("Exception with some extra information...")
RunTest(False)
Console.WriteLine()
Console.WriteLine("Exception with all extra information...")
RunTest(True)
End Sub
Public Sub RunTest(displayDetails As Boolean)
Try
NestedRoutine1(displayDetails)
Catch e As Exception
Console.WriteLine("An exception was thrown.")
Console.WriteLine(e.Message)
If e.Data.Count > 0 Then
Console.WriteLine(" Extra details:")
For Each de As DictionaryEntry In e.Data
Console.WriteLine(" Key: {0,-20} Value: {1}",
"'" + de.Key.ToString() + "'", de.Value)
Next
End If
End Try
End Sub
Public Sub NestedRoutine1(displayDetails As Boolean)
Try
NestedRoutine2(displayDetails)
Catch e As Exception
e.Data("ExtraInfo") = "Information from NestedRoutine1."
e.Data.Add("MoreExtraInfo", "More information from NestedRoutine1.")
Throw e
End Try
End Sub
Public Sub NestedRoutine2(displayDetails As Boolean)
Dim e As New Exception("This statement is the original exception message.")
If displayDetails Then
Dim s As String = "Information from NestedRoutine2."
Dim i As Integer = -903
Dim dt As DateTime = DateTime.Now
e.Data.Add("stringInfo", s)
e.Data("IntInfo") = i
e.Data("DateTimeInfo") = dt
End If
Throw e
End Sub
End Module
' This example displays the following output:
' Exception with some extra information...
' An exception was thrown.
' This statement is the original exception message.
' Extra details:
' Key: 'ExtraInfo' Value: Information from NestedRoutine1.
' Key: 'MoreExtraInfo' Value: More information from NestedRoutine1.
'
' Exception with all extra information...
' An exception was thrown.
' This statement is the original exception message.
' Extra details:
' Key: 'stringInfo' Value: Information from NestedRoutine2.
' Key: 'IntInfo' Value: -903
' Key: 'DateTimeInfo' Value: 7/29/2013 10:50:13 AM
' Key: 'ExtraInfo' Value: Information from NestedRoutine1.
' Key: 'MoreExtraInfo' Value: More information from NestedRoutine1.
Keterangan
Gunakan System.Collections.IDictionary objek yang dikembalikan oleh properti Data untuk menyimpan dan mengambil informasi tambahan yang relevan dengan pengecualian. Informasi tersebut dalam bentuk jumlah pasangan kunci/nilai yang ditentukan pengguna. Komponen utama dari setiap pasangan kunci/nilai biasanya merupakan string identifikasi, sedangkan komponen nilai pasangan dapat berupa semua jenis objek.
Keamanan pasangan kunci/nilai
Pasangan kunci/nilai yang disimpan dalam koleksi yang dikembalikan oleh properti Data tidak aman. Jika aplikasi Anda memanggil serangkaian rutinitas berlapis, dan setiap rutinitas berisi penangan pengecualian, tumpukan panggilan yang dihasilkan berisi hierarki penangan pengecualian tersebut. Jika rutinitas tingkat bawah melempar pengecualian, handler pengecualian tingkat atas apa pun dalam hierarki tumpukan panggilan dapat membaca dan/atau memodifikasi pasangan kunci/nilai yang disimpan dalam koleksi oleh handler pengecualian lainnya. Ini berarti Anda harus menjamin bahwa informasi dalam pasangan kunci/nilai tidak rahasia dan bahwa aplikasi Anda akan beroperasi dengan benar jika informasi dalam pasangan kunci/nilai rusak.
Konflik utama
Konflik kunci terjadi ketika penangan pengecualian yang berbeda menentukan kunci yang sama untuk mengakses pasangan kunci/nilai. Berhati-hatilah saat mengembangkan aplikasi Anda karena konsekuensi dari konflik utama adalah bahwa penangan pengecualian tingkat bawah secara tidak sengaja dapat berkomunikasi dengan handler pengecualian tingkat yang lebih tinggi, dan komunikasi ini dapat menyebabkan kesalahan program yang halus. Namun, jika Anda berhati-hati, Anda dapat menggunakan konflik kunci untuk meningkatkan aplikasi Anda.
Hindari konflik utama
Hindari konflik utama dengan mengadopsi konvensi penamaan untuk menghasilkan kunci unik untuk pasangan kunci/nilai. Misalnya, konvensi penamaan mungkin menghasilkan kunci yang terdiri dari nama aplikasi Anda yang dibatasi periode, metode yang menyediakan informasi tambahan untuk pasangan tersebut, dan pengidentifikasi unik.
Misalkan dua aplikasi, bernama Produk dan Pemasok, masing-masing memiliki metode bernama Sales. Metode Penjualan dalam aplikasi Produk menyediakan nomor identifikasi (unit penyimpanan stok atau SKU) produk. Metode Penjualan dalam aplikasi Pemasok menyediakan nomor identifikasi, atau SID, dari pemasok. Akibatnya, konvensi penamaan untuk contoh ini menghasilkan kunci, "Products.Sales.SKU" dan "Suppliers.Sales.SID".
Mengeksploitasi konflik kunci
Mengeksploitasi konflik kunci dengan menggunakan adanya satu atau beberapa kunci khusus yang telah diatur sebelumnya untuk mengontrol pemrosesan. Misalkan, dalam satu skenario, handler pengecualian tingkat tertinggi dalam hierarki tumpukan panggilan menangkap semua pengecualian yang dilemparkan oleh handler pengecualian tingkat bawah. Jika pasangan kunci/nilai dengan kunci khusus ada, penangan pengecualian tingkat tinggi memformat pasangan kunci/nilai yang tersisa dalam beberapa cara yang tidak biasa pada objek IDictionary; jika tidak, pasangan kunci/nilai yang tersisa diformat dengan cara yang normal.
Sekarang misalkan, dalam skenario lain, handler pengecualian di setiap tingkat hierarki tumpukan panggilan menangkap pengecualian yang dilemparkan oleh handler pengecualian tingkat bawah berikutnya. Selain itu, setiap handler pengecualian mengetahui koleksi yang dikembalikan oleh Data properti berisi sekumpulan pasangan kunci/nilai yang dapat diakses dengan sekumpulan kunci yang telah diatur sebelumnya.
Setiap handler pengecualian menggunakan sekumpulan kunci yang telah diatur sebelumnya untuk memperbarui komponen nilai pasangan kunci/nilai yang sesuai dengan informasi yang unik untuk penanganan pengecualian tersebut. Setelah proses pembaruan selesai, handler pengecualian melemparkan pengecualian ke handler pengecualian tingkat lebih tinggi berikutnya. Terakhir, handler pengecualian tingkat tertinggi mengakses pasangan kunci/nilai dan menampilkan informasi pembaruan terkonsolidasi dari semua handler pengecualian tingkat bawah.