首页 雷火竞猜正文

奔跑吧兄弟,C++|简略了解反常处理的履行流程-雷火电竞平台官网

admin 雷火竞猜 2019-06-22 220 0

反常是程序在履行期间发生的问题,比方测验除以零的操作。

反常处理一般用于处理过错状况,供给了一种搬运程序操控权的方法。

一旦处理了过错,它就不再是过错了。

C++ 反常处理涉及到三个关键字:try、catch、throw。try 块中的代码标识将被激活的特定反常,当问题出现时,程序会抛出(throw)一个反常,在您想要处理问题的当地,经过反常处理程序捕获反常。

一般用以下结构来处理反常:

Typename1 var1
Typename2 var2
……
try
{
//可能发生反常的代码序列
throw var1;
throw var2;
//调用函数,而throw写在函数界说内
}
catch(Typename1 e1){……}
catch(Typename2 e2){……}
……

try块能够引发恣意数量的不同类型的反常,每个catch块只能捕获一个反常,能够运用多个catch块(catch块中不需要参数)。在任何一次履行中,只能引发一个反常。

在C++中,当抛出一个反常时,会导致程序流程的改动。

当抛出反常时,try块中止履行,catch块开端履行。

Try块与if else句子十分类似,假如一切正常,则履行整个try块。

不然,假如抛出反常,则履行catch块。

Try块和if else句子之间的一大差异在于Try块向其分支之一发送音讯的才能。

实例:

#include  
int main()
{
int x,y;
cout << "Enter values of x::";
cin >> x;
cout << "Enter values of y::";
cin >> y;
int r=x-y;
try
{
if ( r!=0)
{
cout << "Result of division is x/r:: " << x/r << "\n";
}
else
{
throw ( r);
}
}
catch( int r)
{
cout << "Division by zero exception::
value of r is::" << r << "\n";
}
cout << "END";
return 0;
}

try块中调用函数,而throw写在函数界说内:

#include 
using namespace std;

double division(int a, int b)
{
if( b == 0 )
{
throw "Division by zero condition!";
}
return (a/b);
}

int main ()
{
int x = 50;
int y = 0;
double z = 0;

try {
z = division(x, y);
cout << z << endl;
}catch (const char* msg) {
cerr << msg << endl;
}

return 0;
}

C++中不存在的新反常,能够经过重写和承继反常类功能来界说。

下面来看看看用户界说的反常的简略比如,其间运用std::exception类来界说反常。

#include  
#include
using namespace std;
class MyException : public exception{
public:
const char * what() const throw()
{
return "Attempted to divide by zero!\n";
}
};
int main()
{
try
{
int x, y;
cout << "Enter the two numbers : \n";
cin >> x >> y;
if (y == 0)
{
MyException z;
throw z;
}
else
{
cout << "x / y = " << x/y << endl;
}
}
catch(exception& e)
{
cout << e.what();
}
return 0;
}

也能够界说一个全新的反常类:

#include 
#include
using namespace std;
class NegativeNumber
{
public:
NegativeNumber();
NegativeNumber(string takeMeToYourCatchBlock);
string getMessage();
private:
string message;
};
class DivideByZero
{};
int main()
{
int jemHadar, klingons;
double portion;
try
{
cout << "Enter number of Jem Hadar warriors:\n";
cin >> jemHadar;
if (jemHadar < 0)
throw NegativeNumber("Jem Hadar");
cout << "How many Klingon warriors do you have?\n";
cin >> klingons;
if (klingons < 0)
throw NegativeNumber("Klingons");
if (klingons != 0)
portion = jemHadar/static_cast(klingons);
else
throw DivideByZero();
cout << "Each Klingon must fight "
<< portion << " Jem Hadar.\n";
}
catch(NegativeNumber e)
{
cout << "Cannot have a negative number of "
<< e.getMessage() << endl;
}
catch(DivideByZero)
{
cout << "Send for help.\n";
}
cout << "End of program.\n";
return 0;
}
NegativeNumber::NegativeNumber()
{}
NegativeNumber::NegativeNumber(string takeMeToYourCatchBlock)
: message(takeMeToYourCatchBlock)
{}
string NegativeNumber::getMessage()
{
return message;
}

假如能够轻松地编写代码来处理问题,请不要引发反常。

只有当您不能想出一个能够发生合理代码的代替计划时,才应该慎重地运用反常。

抛出反常答应您将操控流跳转到程序中的简直任何方位,这种不受约束的操控流一般被认为是糟糕的编程风格,由于它使程序难以了解。

bad_alloc是一个为new操作符预订的能够抛出的反常:

 try
{
NodePtr pointer = new Node;
}

catch(bad_alloc)
{
cout << "Ran out of memory!";
}

-End-

雷火电竞版权声明

本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。

最近发表

    雷火电竞平台官网_雷火竞猜_雷火电竞csgo

    http://www.koisoku.net/

    |

    Powered By

    使用手机软件扫描微信二维码

    关注我们可获取更多热点资讯

    雷火电竞出品