Changeset 4021


Ignore:
Timestamp:
Nov 26, 2020, 6:25:24 AM (2 years ago)
Author:
Peter
Message:

closes #961. Improve message in thrown exceptions.

Location:
trunk
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/test/vcf.cc

    r3747 r4021  
    2424
    2525#include "yat/omic/VCF.h"
     26#include "yat/utility/utility.h"
    2627
    2728#include <fstream>
     
    4142    if (false) {
    4243      std::ifstream is("nonsense.vcf");
    43       VCF vcf;
     44      VCF vcf(is);
    4445      test::avoid_compiler_warning(vcf);
    4546    }
     
    121122    }
    122123
     124    // test getting int when value is a String
     125    try {
     126      double x;
     127      vcf.info().get(x, "FOO");
     128      suite.add(false);
     129    }
     130    catch (utility::runtime_error& e) {
     131      std::ostringstream os;
     132      utility::print_what(e, os);
     133      suite.out() << "expected exception: what: " << os.str();
     134      if (os.str().find("FOO")==std::string::npos) {
     135        suite.add(false);
     136        suite.err() << "error: expected 'FOO' mentioned in what()\n";
     137      }
     138    }
     139
    123140    suite.out() << "test data\n";
    124141    std::vector<std::string> GT;
     
    148165    ID.push_back("baz");
    149166    vcf.data().add("ID", ID);
     167
     168    // test unknown key
     169    try {
     170      vcf.data().get("banana", GT);
     171    }
     172    catch (utility::runtime_error& e) {
     173      std::ostringstream os;
     174      utility::print_what(e, os);
     175      suite.out() << "expected exception: what: " << os.str();
     176      std::vector<std::string> tags = { "unknown key", "banana"};
     177      for (size_t i=0; i<tags.size(); ++i)
     178        if (os.str().find(tags[i]) == std::string::npos) {
     179          suite.add(false);
     180          suite.err() << "error: expected '" << tags[i]
     181                      << "' in error message\n";
     182        }
     183    }
     184
     185    // test getting int when value is a String
     186    try {
     187      std::vector<int> p;
     188      vcf.data().get("ID", p);
     189    }
     190    catch (utility::runtime_error& e) {
     191      std::ostringstream os;
     192      utility::print_what(e, os);
     193      suite.out() << "expected exception: what: " << os.str();
     194      if (os.str().find("ID")==std::string::npos) {
     195        suite.add(false);
     196        suite.err() << "error: expected 'ID' mentioned in what()\n";
     197      }
     198    }
    150199  }
    151200  catch (std::exception& e) {
  • trunk/yat/omic/VCF.h

    r3999 r4021  
    600600    size_t begin = str_.find(k);
    601601
    602     if (begin == std::string::npos) {
    603       converter(value, result);
    604       return;
    605     }
    606 
    607     if (begin && str_[begin-1]!=';') {
    608       k = ";" + key + "=";
    609       begin = str_.find(k, begin+key.size());
     602    try {
    610603      if (begin == std::string::npos) {
    611604        converter(value, result);
    612605        return;
    613606      }
     607
     608      if (begin && str_[begin-1]!=';') {
     609        k = ";" + key + "=";
     610        begin = str_.find(k, begin+key.size());
     611        if (begin == std::string::npos) {
     612          converter(value, result);
     613          return;
     614        }
     615      }
     616
     617      begin += k.size();
     618      int end = str_.find(";", begin);
     619      value = str_.substr(begin, end-begin);
     620      converter(value, result);
    614621    }
    615 
    616     begin += k.size();
    617     int end = str_.find(";", begin);
    618     value = str_.substr(begin, end-begin);
    619     converter(value, result);
     622    catch (utility::runtime_error& e) {
     623      std::ostringstream msg;
     624      msg << "invalid VCF::Info format for key '" << key << "'";
     625      std::throw_with_nested(utility::runtime_error(msg.str()));
     626    }
    620627  }
    621628
     
    642649    detail::Converter<T> converter;
    643650    data.resize(data_.size());
    644     for (size_t i=0; i<data.size(); ++i)
    645       converter(data_[i][idx], data[i]);
    646   }
    647 
    648 
    649   /*
    650   template<typename T>
    651   void VCF::add_data(const std::string& key, const std::vector<T>& val)
    652   {
    653     if (format() != "")
    654       format() += ":";
    655     format() += key;
    656 
    657 
    658     YAT_ASSERT(val.size()+9 == vec_.size());
    659     for (size_t i=0; i<val.size(); ++i) {
    660       std::string& data = vec_[i+9];
    661       if (data != "")
    662         data += ":";
    663       append(data, val[i]);
     651    try {
     652      for (size_t i=0; i<data.size(); ++i)
     653        converter(data_[i][idx], data[i]);
     654    }
     655    catch (utility::runtime_error& e) {
     656      std::ostringstream msg;
     657      msg << "invalid VCF::Data format for key '" << key << "'";
     658      std::throw_with_nested(utility::runtime_error(msg.str()));
    664659    }
    665660  }
    666   */
     661
     662
    667663}}}
    668664#endif
Note: See TracChangeset for help on using the changeset viewer.