C++/C#异常抛出

lex*_*eme 1 c# c++ exception-handling

在c ++中,我可以抛出一个裸字符串作为异常,但在c#中我必须抛出一个Exception.什么是c#相当于在c ++中抛出一个字符串?

例如,在c ++我可以throw "something bad happened".在c#中,这将是.....?

Mat*_*lia 6

问题是相当模糊的,但我认为问题是"在C++中你可以抛出字符串;那么C#呢?"

在C#中,您以与在C++中类似的方式抛出异常; 主要区别在于,在C#中你只能抛出派生的类System.Exception,而在C++中你可以抛出任何类型(尽管通常建议只抛出std::exception从另一个异常基类派生的类;我不会在C++中抛出纯字符串).

请记住,在C#中不仅仅有System.Exception,但有描述的最常见原因引发异常(各种派生类的卡车ArgumentOutOfRangeException,InvalidOperationException,OverflowException,...只是说一些随机的),这给你一个表达问题类型的更好方法(用类型表示,可以用catch块区分),并且你仍然可以通过在构造函数中传递它来指定自定义错误字符串.这比仅仅抛出一个字符串要好得多,也因为,如果异常"冒泡"到最高层catch,或多或少只能记录问题并退出,仍然可以捕获一个通用System.Exception但仍然显示/记录错误串.

请注意,这在C++中也是可行的,但现成的派生异常(in <stdexcept>)远小于.NET Framework提供的异常.

另一个重要的区别(来自C++)是,在C++中,来自throw的堆栈展开会立即破坏任何本地对象(构建RAII的概念),在C#中,破坏是不确定的(它可能在任何时候发生)指向他们的变量超出范围); 因此,在这种情况下必须立即释放的类实现IDisposable接口并使用using块是很重要的.