2013年10月15日 星期二

C++ 捕捉不到 vector 超出範圍的例外 ?

C++ 的 vector 存取資料的方式,可以用
  1. 使用 [ ] 操作符(operator),例如:v[1] = 100
  2. 使用 at() 方法,例如:v.at(1) = 100;
兩者有一個差異,
使用 [ ] 操作符(operator),若索引超出範圍,不會丟出 exception
使用 at() 方法,若索引超出範圍,會丟出 out_of_range 的 exception
所以若用 [ ] 的方式存取資料,便無法使用 try...catch...捕捉例外
#include "stdafx.h"
#include <iostream>
#include <vector>

int _tmain(int argc, _TCHAR* argv[])
{
    std::vector <int> vInt;
    try
    {
        vInt.at(1) = 100 ; // throw out_of_range
        // vInt[1] = 100 ; // 不會丟出 exception
    }catch (std::out_of_range& oor){
        std::cout << "out_of_range";
    }catch(std::exception& e){
        std::cout << "exception";
    }
    return 0;
}


用 [] 存取資料,超出範圍,程式停止執行時的錯誤訊息
Expression:vector subscript out of range

用 at() 存取資料,超出範圍,若沒使用 try...catch... 處理,程式停止執行時的錯誤訊息
exception: std::out_of_range at memory location


參考:
Visual C++ Try Catch Exception block not entered
Accessing elements of a vector in C++?
Which vector threw index out of range exception?
why when I use std:vector and operator [] In out of range case don't get a exception?
http://www.cplusplus.com/reference/vector/vector/operator%5B%5D/
http://www.cplusplus.com/reference/vector/vector/at/

1 則留言: