2016-05-24 12 views
-1

QTテストアプリケーション(私が作ったいくつかの機能をテストするGUIを備えたアプリケーション)を作成しましたが、私の例外は全く機能しません。ubuntuでg ++でtry + catchブロックが動作しないのはなぜですか?

に例外をスローする関数は(私のテストでそれがstd::invalid_argumentをスロー):

std::vector<pcl::PointCloud<pcl::PointXYZRGB>::Ptr> cloud_manip::fragment_cloud(
     pcl::PointCloud<pcl::PointXYZRGB>::Ptr cloud_ptr, float max_scaled_fragment_depth) 
{ 
    if (!cloud_ptr) 
    { 
     throw invalid_cloud_pointer(); 
    } 

    if ((aux::cmp_floats(max_scaled_fragment_depth, 0.00, 0.005)) || (max_scaled_fragment_depth < 0)) 
     throw std::invalid_argument("Invalid max fragment depth."); 

    float curr_depth = FLT_MAX; 
    std::vector<pcl::PointCloud<pcl::PointXYZRGB>::Ptr> cloud_fragments; 

    for (unsigned int cloud_it = 0; cloud_it < cloud_ptr->points.size(); cloud_it++) 
    { 
     // end of a fragment 
     if ((cloud_ptr->points[cloud_it].y > (curr_depth + max_scaled_fragment_depth)) 
       || (cloud_ptr->points[cloud_it].y < (curr_depth - max_scaled_fragment_depth))) 
     { 
      curr_depth = cloud_ptr->points[cloud_it].y; 
      pcl::PointCloud<pcl::PointXYZRGB>::Ptr new_cloud(new pcl::PointCloud<pcl::PointXYZRGB>); 
      cloud_fragments.push_back(new_cloud); 
     } 

     // filling current cloud 
     else 
      (cloud_fragments.back())->points.push_back(cloud_ptr->points[cloud_it]); 
    } 

    return cloud_fragments; 
} 

最初の関数キャッチたぶん私は、コードが、何かが私には正しいようで欠けている、ここではサンプルです例外:

pcl::PointCloud<pcl::PointXYZRGB>::Ptr fast_normal_estimation(pcl::PointCloud<pcl::PointXYZRGB>::Ptr cloud_ptr, int max_neighbs, 
                float radius, float x_scale, float y_scale, float z_scale, float max_fragment_depth) 
{ 
    try 
    { 
     // the cloud colored by its normal vectors; return value 
     pcl::PointCloud<pcl::PointXYZRGB>::Ptr colored_cloud_ptr; 

     float max_scaled_fragment_depth = max_fragment_depth/y_scale; 

     cloud_manip::scale_cloud(cloud_ptr, x_scale, y_scale, z_scale); // scaling cloud 

     std::vector<pcl::PointCloud<pcl::PointXYZRGB>::Ptr> cloud_fragments = 
       cloud_manip::fragment_cloud(cloud_ptr, max_scaled_fragment_depth); // fragmenting cloud for less execution time 

     // estimating the normals for each cloud fragment in parallel 
     // #pragma omp parallel for schedule(static) 
     for (unsigned int i = 0; i < cloud_fragments.size(); i++) 
     { 
      normal_estimation(cloud_fragments[i], radius, max_neighbs); 
     } 

     colored_cloud_ptr = cloud_manip::merge_clouds(cloud_fragments); // merging fragments to build original cloud 

     cloud_manip::scale_cloud(colored_cloud_ptr, (1.0/x_scale), (1.0/y_scale), (1.0/z_scale)); // restoring widop scale 

     return colored_cloud_ptr; 
    } 

    catch (const std::logic_error& le) 
    { 
     throw le; 
    } 
} 

テスト機能:

void test_normal_estimation(std::string import_path, std::string export_path, float radius, 
          int max_neighbs, float x_scale, float y_scale, float z_scale, 
          float max_fragment_depth) 
{ 
    try 
    { 
     pcl::PointCloud<pcl::PointXYZRGB>::Ptr base_cloud; 
     pcl::PointCloud<pcl::PointXYZRGB>::Ptr colored_cloud; // output cloud 

     base_cloud = cloud_io::import_cloud(import_path); 
     colored_cloud = fast_normal_estimation(base_cloud, max_neighbs, radius, x_scale, y_scale, z_scale, 
               max_fragment_depth); 
     cloud_io::export_cloud(export_path + "normal_estimation_test_" + boost::lexical_cast<std::string>(radius) + "_" 
           + boost::lexical_cast<std::string>(max_neighbs) + "_" + boost::lexical_cast<std::string>(x_scale) + "_" 
           + boost::lexical_cast<std::string>(y_scale) + "_" + boost::lexical_cast<std::string>(z_scale) + "_" 
           + boost::lexical_cast<std::string>(max_fragment_depth) + ".txt", colored_cloud); 
    } 

    catch(const std::logic_error& le) 
    { 
     throw le; 
    } 
} 

そして最後に、エラーメッセージを表示するようになっているインタフェース:

void normal_estimation_test_form::on_launch_test_btn_clicked() 
{ 
    // for when the test is done 
    QMessageBox done; 

    this->setEnabled(false); 

    _ned->radius = ui->radius_dsb->value(); 
    _ned->max_neighbs = ui->max_neighbs_sb->value(); 
    _ned->x_scale = ui->x_scale_dsb->value(); 
    _ned->y_scale = ui->y_scale_dsb->value(); 
    _ned->z_scale = ui->z_scale_dsb->value(); 
    _ned->max_fragment_depth = ui->max_fragm_depth_sb->value(); 

    try 
    { 
     test_normal_estimation(_ned->cloud_in_path, _ned->cloud_out_path, _ned->radius, 
           _ned->max_neighbs, _ned->x_scale, _ned->y_scale, 
           _ned->z_scale, _ned->max_fragment_depth); 

     done.setText("Cloud normal estimation test completed."); 
     done.exec(); 
    } 

    catch (const std::logic_error& le) 
    { 
     QErrorMessage q_err_msg; 
     QString err_msg; 

     err_msg.append("Invalid input."); 
     q_err_msg.showMessage(err_msg, "Input Error"); 
    } 
} 

私の例外がすべてで捕まるしない理由を任意のアイデア?前もって感謝します。

edit_1:私はstd::invalid_argumentをキャッチしていないよ知っているが、それはcplusplusに応じstd::logic_errorのサブクラスのためです。

+0

'std :: logical_error'をキャッチした後に' std :: invalid_argument'をキャッチした場合、QTは 'std :: invalid_argument'が' std :: logic_error'のサブクラスであると警告していますので、 'std :: logic_error'ブロックです。 –

+0

あなたはそれを投げていると確信していますか? – Nim

+0

私はデバッガを使ってそれを段階的にチェックしました。はい、 'if'ブロックに入ります。それはそれをスローし、何も起こりません。私のnormal_estimation_test_formのウィンドウは無効になります(テストが起動されるとき)。htop(ubuntuのタスクマネージャ)を使用すると、通常の推定機能が実行されていないことがわかります。 。 –

答えて

0

私はこの問題に対する答えを見つけました。それはここで説明されています:exception handling in Qt。それはそれを行う正当な方法のように見えませんが、私はそれ以上のことは分かりません。

関連する問題