如何在c#中抛出/导致非.net异常?

时间:2014-07-22 13:10:57

标签: c# exception exception-handling

因此,出于测试目的,我想抛出一个不是从Exception派生的异常。

任何在c#中执行此操作的方法,可能是通过调用一些低级API,这会导致这种情况发生吗?

或者我需要写一些c ++吗?

3 个答案:

答案 0 :(得分:0)

来自Handling and Throwing Exceptions

  

运行时如何管理例外

     

运行时使用基于异常对象和受保护代码块的异常处理模型。创建Exception对象以在发生异常时表示异常。   运行时为每个可执行文件创建一个异常信息表。可执行文件的每个方法都在异常信息表中具有关联的异常处理信息数组(可以为空)。数组中的每个条目都描述了受保护的代码块,与该代码关联的任何异常过滤器以及任何异常处理程序(catch语句)。此异常表非常有效,并且在未发生异常时不会对处理器时间或内存使用造成任何性能损失。只有在发生异常时才使用资源。

基本上,你无法正确地继承Exception。即使通过C ++抛出异常也会导致异常传播到托管代码(如果有的话)到某种形式的异常对象,该异常对象继承自Exception

  

由于执行线程通常遍历托管和非托管代码块,因此运行时可以在托管代码或非托管代码中抛出或捕获异常。非托管代码可以包括C ++样式的SEH异常和基于COM的HRESULTS。

答案 1 :(得分:0)

C#只能抛出从System.Exception派生的异常。也就是说,CLR允许投掷任何物体。所以你可以通过在CIL中编写类库来做你想做的事(编辑:这并不像听起来那么困难)并编写一个方法来抛出一个不是从Exception派生的对象。我不知道C#会如何看待那个对象。

答案 2 :(得分:0)

您可以抛出不是源自C ++ / CLI中的Exception类型的对象

请参见https://docs.microsoft.com/en-us/dotnet/api/system.runtime.compilerservices.runtimewrappedexception?view=netframework-4.8#examples

中的示例代码
using namespace System;
using namespace System::Runtime::CompilerServices;

[assembly:RuntimeCompatibilityAttribute(WrapNonExceptionThrows = true)]; 

void run()
{
    try
    {
        throw gcnew String("This is a string");

    }
    catch(RuntimeWrappedException^ e)
    {
        Console::WriteLine("RuntimeWrappedException caught!");
    }
}

int main()
{
    run();

    return 0;
}