Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/wix/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;异常处理-具体示例_C++_Exception_Exception Handling - Fatal编程技术网

C++ C++;异常处理-具体示例

C++ C++;异常处理-具体示例,c++,exception,exception-handling,C++,Exception,Exception Handling,我有此程序(程序的部分未发布): //包含和函数 int main(int argc,char*argv[]) { ifstream loc(“acgregations.loc”,ios::binary); getline(位置、标题、静态施法(1)); 位置seekg(15,ios::cur); loc.read(重新解释铸件和分块),尺寸(分块); 对于(int i=0;i

我有此程序(程序的部分未发布):

//包含和函数
int main(int argc,char*argv[])
{
ifstream loc(“acgregations.loc”,ios::binary);
getline(位置、标题、静态施法(1));
位置seekg(15,ios::cur);
loc.read(重新解释铸件和分块),尺寸(分块);
对于(int i=0;i
如果出现以下情况,我想终止该计划: -文件未打开; -getline获取的头字符串不等于“string”; -任何读取功能失败; -任何seekg故障; -strid与1234不匹配

如何使用C++异常来实现这一点?我应该使用一个
try{}catch(…){}
块,创建函数,例如,在失败时读取数据并发送
EOF_reacted
,还是使用
try{}catch(var e){}catch(var2e){}
,或任何其他方式

我理解简单函数中异常的概念,但当有一个更大的程序时,它会变得复杂


<>我没有发现任何C++函数源代码,它在main函数中显式使用了TestCcatch块,但是使用异常。如何做到这一点?

最详细的方法是对特定的异常进行子类化,该异常将为您提供有关发生情况的上下文,例如:

class FileNotOpenedException : public std::runtime_error {};

int main(int argc, char *argv[])
{
   try
   {
      ifstream loc("achievements.loc", ios::binary);

      if(!loc.is_open())
         throw FileNotOpenedException;

      // ...
   }
   catch(const FileNotOpenedException& e)
   {
      // ...
   }
}
然而,请注意,在预期的错误条件下使用异常并不一定是好的做法。异常应该只用于真正的“异常”情况,这在您的程序中是完全意外的,在特定范围内您无法从中恢复。上面没有打开的文件就是一个坏例子。但是,
read()
seekg()
函数中的一个出现故障可能更合适


也就是说,你可以按你的要求去做,上面是一个这样做的例子。

你说过使用异常只在read()和seekg()中是一个很好的做法,对吗?我应该如何进行检查?在不使用异常的情况下,如果无法打开文件,如何终止程序?我可以使用abort()或exit(),但这也是一种不好的做法,对吗?-1关于何时使用异常的建议完全是错误的,导致读者误入歧途。对于“完全出乎意料的事情”,
assert
。或者干脆
中止
。可能是在登录之后。在这个简单的例子中,如果文件当时没有打开,您会主张使用异常吗?可以通过简单的
if
检查来处理的事情,并立即处理(记录)?这是错误的。也许你的任务不是编写大量的时间关键型低延迟软件?
class FileNotOpenedException : public std::runtime_error {};

int main(int argc, char *argv[])
{
   try
   {
      ifstream loc("achievements.loc", ios::binary);

      if(!loc.is_open())
         throw FileNotOpenedException;

      // ...
   }
   catch(const FileNotOpenedException& e)
   {
      // ...
   }
}