【问题标题】:C++ ifstream exception masks for C#C# 的 C++ ifstream 异常掩码
【发布时间】:2015-05-05 23:47:00
【问题描述】:

如何将此行从 C++ 转换为 C#?

std::ifstream in;
in.exceptions(std::ios_base::badbit); //*THIS LINE*

根据this page,前一行代码为流设置了一个新的异常掩码,并清除了所有当前的错误状态标志。我还猜测它是上面链接页面中std::ios::exceptions 的“第二种形式”。

由于我对 C# 的 FileStream 类缺乏经验,由于缺乏类似的东西,我一直很困惑。

【问题讨论】:

  • 仅适用于 C++:抛出异常的流很糟糕(我认为)。对于与 c++/clr 交互的 C++,情况变得更糟 - 您必须将 C++ 异常转换为 C++/clr 异常,同时跨越从 C++ 到 C++/clr 的边界
  • 感谢您的回复!我没有使用 C++/clr。我只想用 C# 完成同样的事情。
  • 您是否尝试让 FileStream 在 IO 错误时抛出异常?因为这是默认行为。如果发生 IO 错误,Read 和 Write 方法都会抛出 IOException。
  • @pixelbadger 这正是我需要知道的。谢谢!
  • 我在回答中扩展了我的陈述。如果您觉得我的评论有用,如果您能将此标记为答案,我将不胜感激。

标签: c# c++ ios exception ifstream


【解决方案1】:

如果发生任何底层 I/O 错误,FileStream.ReadFileStream.Write 方法都将抛出 IOException。这是默认行为。

与 C++ 不同,异常抛出是 C# 中错误处理的预期形式。因为异常从一开始就是 .NET 的一部分,所以 the contention 不会像 C++ 那样在流中使用异常。

大多数(如果不是全部).NET 框架标准库都会在异常状态下抛出异常。我能想到的唯一例外是使用 Try-Parse pattern 时,它对预期行为非常明确。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-09-23
    • 2014-06-08
    • 1970-01-01
    • 2012-06-17
    • 2016-02-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多