异常处理

异常处理

1.异常基本概念与用法

  • 方法内throw

throw啥类型,catch就需要指定成啥类型,否则,就catch不到, 但是如果有catch(…),当它上面的catch都没有catch到,就会被catch(…) catch到。而且catch(…)必须放到最后。

#include <iostream>
using namespace std;

float divs(const int& a, const int& b){
  if(b == 0){
    short x;
    throw x;
  }
  return a/b;
}

int main(){
  int a = 10;
  int b = 0;
  try{
    float r = divs(a,b);
    cout << r << endl;
  }
  catch(int){
    cout << "Div err(int)" << endl;
  }
  catch(short){
    cout << "Div err(short)" << endl;
  }
  catch(...){//必须放到最后       
  }
}
  • 方法声明出throw

只能够抛出声明出的类型,下面的例子就只能抛出short,int类型的异常,别的类型的异常是不能抛出去的。

下面的例子,编译没有问题,但是运行就会崩溃,因为方法内抛出的long类型的异常,但是方法声明的地方,不允许抛出long类型的异常。

#include <iostream>
using namespace std;

float divs(const int& a, const int& b)throw(short, int){
  if(b == 0){
    long x;
    throw x;
  }
  return a/b;
}

int main(){
  int a = 10;
  int b = 0;
  try{
    float r = divs(a,b);
    cout << r << endl;
  }
  catch(int){
    cout << "Div err(int)" << endl;
  }
  catch(short){
    cout << "Div err(short)" << endl;
  }
  catch(...){//必须放到最后       
  }
}
  • 方法不允许抛出异常

方法声明时,用throw()的话,就表明这个方法不允许抛出任何异常。

下面的例子,编译可以通过,运行崩溃。

#include <iostream>
using namespace std;

float divs(const int& a, const int& b)throw(){
  if(b == 0){
    short x;
    throw x;
  }
  return a/b;
}

int main(){
  int a = 10;
  int b = 0;
  try{
    float r = divs(a,b);
    cout << r << endl;
  }
  catch(int){
    cout << "Div err(int)" << endl;
  }
  catch(short){
    cout << "Div err(short)" << endl;
  }
  catch(...){//必须放到最后       
  }
}

2.自定义异常类

模拟栈的类,有push和pop接口,当push时,如果超过了最大空间就抛出异常;当pop时,如果达到栈的最底部就抛出异常,分别做了2个自定义异常类。

#include <iostream>
#include <string>

using namespace std;

template <typename Y>
class PushFull{
public:
  PushFull(const char* s, Y val) : str(s), value(val){
  }
  ~PushFull(){
  }
  void what(){
    cout << str << endl;
    cout << "value:" << value << endl;
  }
private:
  string str;
  Y value;
};

class PopEnd{
public:
  PopEnd(const char* s) : str(s){}
  ~PopEnd(){}
  void what(){
    cout << str << endl;
  }
private:
  string str;
};

template <typename T>
class Stack{
public:
  Stack(int sz = STACK_SIZE){
    cap = sz > STACK_SIZE ? sz :  STACK_SIZE;
    data = new T[cap];
    top = 0;
  }
  ~Stack(){
    delete []data;
    data = NULL;
    cap = top = 0;
  }
  bool isFull() const{
    return top >= cap;
  }
  bool push(const T& t){
    if(isFull()) {
      throw PushFull<T>("stack is full", t);
      return false;
    }
    data[top++] = t;
    return true;
  }
  bool isEnd(){
    return top <= 0;
  }
  T& pop(){
    if(isEnd()){
      throw PopEnd("stack is end");
      return data[0];
    }
    return data[--top];
  }
  void show(){
    for(int i = top - 1; i >= 0; --i){
      cout << data[i] << endl;
    }
  }
private:
  enum{STACK_SIZE = 8};
  T *data;
  size_t cap;
  size_t top;
};

int main(){
  Stack<int> s;
  try{
    for(int i = 1; i <= 8; ++i){
      s.push(i);
    }
  }
  catch(PushFull<int>& e){
    e.what();
  }
  //s.show();
  try{
    for(int i = 1; i <= 18; ++i){
      int p = s.pop();
      cout << p << endl; 
    }
  }
  catch(PopEnd& e){
    e.what();
  }
}
posted @ 2018-06-06 07:05  小石王  阅读(194)  评论(0编辑  收藏  举报