Cara menangkap pengecualian non-CLS
Beberapa bahasa .NET, termasuk C++/CLI, memungkinkan objek untuk melempar pengecualian yang tidak berasal dari Exception. Pengecualian tersebut disebut pengecualian non-CLS atau non-Pengecualian. Di C# Anda tidak dapat membuang pengecualian non-CLS, tetapi Anda dapat menangkapnya dengan dua cara:
Dalam blok
catch (RuntimeWrappedException e)
.Secara default, rakitan Visual C# menangkap pengecualian non-CLS sebagai pengecualian yang dibungkus. Gunakan metode ini jika Anda memerlukan akses ke pengecualian asli, yang dapat diakses melalui properti RuntimeWrappedException.WrappedException. Prosedur selanjutnya dalam topik ini menjelaskan cara menangkap pengecualian dengan cara ini.
Dalam blok tangkapan umum (blok tangkapan tanpa jenis pengecualian yang ditentukan) yang dimasukkan setelah semua blok
catch
lainnya.Gunakan metode ini saat Anda ingin melakukan beberapa tindakan (seperti menulis ke file log) sebagai respons terhadap pengecualian non-CLS, dan Anda tidak memerlukan akses ke informasi pengecualian. Secara default, runtime bahasa umum akan membungkus semua pengecualian. Untuk menonaktifkan perilaku ini, tambahkan atribut tingkat rakitan ini ke kode Anda, biasanya dalam file AssemblyInfo.cs:
[assembly: RuntimeCompatibilityAttribute(WrapNonExceptionThrows = false)]
.
Cara menangkap pengecualian non-CLS
Dalam blok catch(RuntimeWrappedException e)
, akses pengecualian asli melalui properti RuntimeWrappedException.WrappedException.
Contoh
Contoh berikut menunjukkan cara menangkap pengecualian non-CLS yang dilemparkan dari pustaka kelas yang ditulis dalam C++/CLI. Perhatikan bahwa dalam contoh ini, kode klien C# mengetahui sebelumnya bahwa jenis pengecualian yang dilemparkan adalah System.String. Anda dapat mentransmisikan properti RuntimeWrappedException.WrappedException kembali ke jenis aslinya selama jenis tersebut dapat diakses dari kode Anda.
// Class library written in C++/CLI.
var myClass = new ThrowNonCLS.Class1();
try
{
// throws gcnew System::String(
// "I do not derive from System.Exception!");
myClass.TestThrow();
}
catch (RuntimeWrappedException e)
{
String s = e.WrappedException as String;
if (s != null)
{
Console.WriteLine(s);
}
}