The topic you requested is included in another documentation set. For convenience, it's displayed below. Choose Switch to see the topic in its original location.
ILGenerator::BeginFaultBlock Method ()
.NET Framework (current version)
Begins an exception fault block in the Microsoft intermediate language (MSIL) stream.
Assembly: mscorlib (in mscorlib.dll)
| Exception | Condition |
|---|---|
| NotSupportedException | The MSIL being generated is not currently in an exception block. -or- This ILGenerator belongs to a DynamicMethod. |
If the current ILGenerator is associated with a DynamicMethod object, emitting exception fault blocks is not supported. DynamicILInfo can be used to construct a dynamic method that uses exception fault blocks.
The following code sample illustrates the use of BeginFaultBlock.
using namespace System; using namespace System::Threading; using namespace System::Reflection; using namespace System::Reflection::Emit; Type^ AddType() { // Create an assembly. AssemblyName^ myAssemblyName = gcnew AssemblyName; myAssemblyName->Name = "AdderExceptionAsm"; // Create dynamic assembly. AppDomain^ myAppDomain = Thread::GetDomain(); AssemblyBuilder^ myAssemblyBuilder = myAppDomain->DefineDynamicAssembly( myAssemblyName, AssemblyBuilderAccess::Run ); // Create a dynamic module. ModuleBuilder^ myModuleBuilder = myAssemblyBuilder->DefineDynamicModule( "AdderExceptionMod" ); TypeBuilder^ myTypeBuilder = myModuleBuilder->DefineType( "Adder" ); array<Type^>^myAdderParams = {int::typeid,int::typeid}; // Method to add two numbers. MethodBuilder^ myMethodBuilder = myTypeBuilder->DefineMethod( "DoAdd", static_cast<MethodAttributes>(MethodAttributes::Public | MethodAttributes::Static), int::typeid, myAdderParams ); ILGenerator^ myAdderIL = myMethodBuilder->GetILGenerator(); // Create constructor. array<Type^>^temp0 = {String::typeid}; ConstructorInfo^ myConstructorInfo = OverflowException::typeid->GetConstructor( temp0 ); MethodInfo^ myExToStrMI = OverflowException::typeid->GetMethod( "ToString" ); array<Type^>^temp1 = {String::typeid,Object::typeid}; MethodInfo^ myWriteLineMI = Console::typeid->GetMethod( "WriteLine", temp1 ); // Declare local variable. LocalBuilder^ myLocalBuilder1 = myAdderIL->DeclareLocal( int::typeid ); LocalBuilder^ myLocalBuilder2 = myAdderIL->DeclareLocal( OverflowException::typeid ); // Define label. Label myFailedLabel = myAdderIL->DefineLabel(); Label myEndOfMethodLabel = myAdderIL->DefineLabel(); // Begin exception block. Label myLabel = myAdderIL->BeginExceptionBlock(); myAdderIL->Emit( OpCodes::Ldarg_0 ); myAdderIL->Emit( OpCodes::Ldc_I4_S, 10 ); myAdderIL->Emit( OpCodes::Bgt_S, myFailedLabel ); myAdderIL->Emit( OpCodes::Ldarg_1 ); myAdderIL->Emit( OpCodes::Ldc_I4_S, 10 ); myAdderIL->Emit( OpCodes::Bgt_S, myFailedLabel ); myAdderIL->Emit( OpCodes::Ldarg_0 ); myAdderIL->Emit( OpCodes::Ldarg_1 ); myAdderIL->Emit( OpCodes::Add_Ovf_Un ); myAdderIL->Emit( OpCodes::Stloc_S, myLocalBuilder1 ); myAdderIL->Emit( OpCodes::Br_S, myEndOfMethodLabel ); myAdderIL->MarkLabel( myFailedLabel ); myAdderIL->Emit( OpCodes::Ldstr, "Cannot accept values over 10 for addition." ); myAdderIL->Emit( OpCodes::Newobj, myConstructorInfo ); myAdderIL->Emit( OpCodes::Stloc_S, myLocalBuilder2 ); myAdderIL->Emit( OpCodes::Ldloc_S, myLocalBuilder2 ); // Call fault block. myAdderIL->BeginFaultBlock(); Console::WriteLine( "Fault block called." ); //Throw exception. myAdderIL->ThrowException( NotSupportedException::typeid ); // Call finally block. myAdderIL->BeginFinallyBlock(); myAdderIL->Emit( OpCodes::Ldstr, "{0}" ); myAdderIL->Emit( OpCodes::Ldloc_S, myLocalBuilder2 ); myAdderIL->EmitCall( OpCodes::Callvirt, myExToStrMI, nullptr ); myAdderIL->EmitCall( OpCodes::Call, myWriteLineMI, nullptr ); myAdderIL->Emit( OpCodes::Ldc_I4_M1 ); myAdderIL->Emit( OpCodes::Stloc_S, myLocalBuilder1 ); // End exception block. myAdderIL->EndExceptionBlock(); myAdderIL->MarkLabel( myEndOfMethodLabel ); myAdderIL->Emit( OpCodes::Ldloc_S, myLocalBuilder1 ); myAdderIL->Emit( OpCodes::Ret ); return myTypeBuilder->CreateType(); } int main() { Type^ myAddType = AddType(); Object^ myObject1 = Activator::CreateInstance( myAddType ); array<Object^>^myObject2 = {11,12}; // Invoke member. myAddType->InvokeMember( "DoAdd", BindingFlags::InvokeMethod, nullptr, myObject1, myObject2 ); }
.NET Framework
Available since 1.1
Portable Class Library
Supported in: portable .NET platforms
Silverlight
Available since 2.0
Windows Phone Silverlight
Available since 7.1
Available since 1.1
Portable Class Library
Supported in: portable .NET platforms
Silverlight
Available since 2.0
Windows Phone Silverlight
Available since 7.1
Show: