在c ++中,我可以抛出一个裸字符串作为异常,但在c#中我必须抛出一个Exception
。什么是c#相当于在c ++中抛出一个字符串?
例如,在c ++中我可以throw "something bad happened"
。在c#中,这将是.....?
答案 0 :(得分:6)
这个问题非常模糊,但我认为问题是“在C ++中你可以抛出字符串;那么C#呢?”
在C#中,您以与C ++相似的方式抛出异常;主要区别在于,在C#中,您只能抛出从System.Exception
派生的类,而在C ++中,您可以抛出任何类型(尽管通常建议只抛出派生自std::exception
的类或来自另一个异常基类的类;我不会在C ++中抛出纯字符串。)
请记住,在C#中不仅有System.Exception
,而且有大量各种派生类可以描述抛出异常的最常见原因(ArgumentOutOfRangeException
,InvalidOperationException
,OverflowException
,...只是说一些随机的),这为你提供了一种更好的方式来表达问题的类型(用类型表示,可以在catch
块中区分),您仍然可以通过在构造函数中传递自定义错误字符串来指定它。这比抛出一个字符串好得多,也是因为,如果异常“冒泡”到最高catch
,或多或少可以记录问题并退出,仍然可以捕获一个通用{{ 1}}并仍然显示/记录错误字符串。
请注意,这在C ++中也是可行的,但现成的派生异常(在System.Exception
中)远远少于.NET Framework提供的异常。
另一个重要的区别(来自C ++)是,在C ++中,来自throw的堆栈展开会立即破坏任何本地对象(构建RAII的概念),在C#中,破坏是不确定的(它可能发生在在指向他们的变量超出范围之后的任何时刻);因此,在这种情况下必须立即释放的类实现<stdexcept>
接口并使用IDisposable
块是非常重要的。
答案 1 :(得分:1)
C#只允许抛出从Exception类派生的对象。 CLR本身也允许抛出其他类型,所以如果你真的想要你应该能够编写用其他语言或IL直接抛出字符串的方法。您将无法在C#中将其作为字符串异常捕获(仅作为具有“catch”的未知异常而没有异常类型)。
根据您的目标,throw new Exception("My string here");
就足够了。
编辑(感谢Neil):但你应该创建自己的例外,除非它是一次性的实验。