如何在c#中引发/引发非.net异常?

如何在c#中引发/引发非.net异常?,c#,exception,exception-handling,C#,Exception,Exception Handling,所以出于测试目的,我想抛出一个不是从异常派生的异常 在c#中,是否有任何方法可以做到这一点,可能是通过调用一些低级API,这将导致这种情况发生 还是我需要写一些C++? 从: 运行时如何管理异常 运行时使用基于异常对象和受保护代码块的异常处理模型。创建异常对象以在异常发生时表示异常。 运行时为每个可执行文件创建一个异常信息表。可执行文件的每个方法在异常信息表中都有一个关联的异常处理信息数组(可以为空)。数组中的每个条目描述一个受保护的代码块、与该代码关联的任何异常过滤器以及任何异常处理程序(ca

所以出于测试目的,我想抛出一个不是从异常派生的异常

在c#中,是否有任何方法可以做到这一点,可能是通过调用一些低级API,这将导致这种情况发生

还是我需要写一些C++?

从:

运行时如何管理异常

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

基本上,您无法正确地从
异常继承
。即使通过C++抛出异常,也会导致异常向托管代码(如果它)派生到某种形式的异常对象,该异常对象继承自<代码>异常< /代码> < /P>。
因为执行线程通常遍历托管和非托管代码块,所以运行时可以在托管或非托管代码中引发或捕获异常。非托管代码可以包括C++风格的SEH异常和基于COM的HRESULT


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

您可以抛出不是从C++/CLI中的
异常
类型派生的对象

请参阅中的示例代码

使用名称空间系统;
使用命名空间System::Runtime::CompilerServices;
[程序集:RuntimeCompatibilityAttribute(WrapnoneExceptionThrows=true)];
无效运行()
{
尝试
{
抛出新字符串(“这是一个字符串”);
}
捕获(RuntimeWrappedException ^e)
{
控制台::WriteLine(“RuntimeWrappedException捕获!”);
}
}
int main()
{
run();
返回0;
}

如果您有在.NET框架之外抛出的C++异常,当您的C代码捕获它们时,它们将被称为“代码> COMPUTION/COMPUTE”,这也是源于<代码>异常< /代码>,因此,我认为没有一种方法可以抛出任何不从
异常继承的异常。这也会导致TIG/catch块的目的,因为它不会被任何<代码> catch < /C> >语句所捕获。@ KryGr:不是所有C++异常都变成了CeExExchange。COMException特定于COM对象。抛出异常的通用C++代码不会转换成CeExabl。我想我在评论的前面加了一句“我可能错了,但我很确定”,但肯定是忘了。这也是为什么我把它作为评论,而不是回答。