当前位置: 首页 > 知识库问答 >
问题:

当函数中没有返回值时,如何引发异常?

别旻
2023-03-14

我在做一个基于线性探测的自定义哈希表,在C 11中,我在其中做了一个get()函数,函数应该返回哈希表中对应键的值,这是我的代码:

template<class Key, class Value>    
Value OpenMap<Key,Value>::get(const Key& k){
    int index = hash(k);
    int i = index;
    do{
        if(buff[i].empty)
            break;
        if(buff[i].elem.key==k)
            return buff[i].elem.value;
        i = (i+1)%capacity;
    }while(i!=index);
}

问题是,传递的每个键在哈希表中可能没有对应的值。在这个函数中,我无法获得如何处理这个异常。处理这个异常的可能方法是什么?C STLunordered_映射如何


共有3个答案

闻人杰
2023-03-14

您可以考虑<代码>可选<代码>。它位于C17标准链接中。现在可以使用boost::optional。可以检查选项的值和。get()如果有值,则可以调用它。该值可以随时重写,也可以像指针一样访问。

template<class Key, class Value>    
boost::optional<Value> OpenMap<Key,Value>::get(const Key& k){
    int index = hash(k);
    int i = index;
    do{
        if(buff[i].empty)
            break;
        if(buff[i].elem.key==k)
            return buff[i].elem.value;
        i = (i+1)%capacity;
    }while(i!=index);
    return boost::none;  // empty optional
}

支才
2023-03-14

我会抛出std::invalid_参数,尽管std::domain_errorstd::out_of_range也有意义。

调用方只需捕获std::exception

宗穆冉
2023-03-14

当找不到任何值时,您可以抛出异常,然后在代码中,您可以将get(...)

class MyException{
    // ordinary class
}

template<class Key, class Value>    
Value OpenMap<Key,Value>::get(const Key& k){
     int index = hash(k);
     int i = index;
     do{
         if(buff[i].empty)
             break;
         if(buff[i].elem.key==k)
             return buff[i].elem.value;
         i = (i+1)%capacity;
    }while(i!=index);
    throw MyException();
}

...
OpenMap<int, int> myMap;
try{
    int value = myMap.get( 10 );
}catch( MyException & ex ){
    // do whatever you want witn ex
}
...

请注意,MyExctive是一个普通类,所以它可以有构造函数和方法,例如,您可以将key作为参数传递,然后打印一条消息,表明找不到此键。

 类似资料:
  • 我希望在数据库中找不到该项时出现异常

  • 问题内容: 我有一个PDO功能: 当我执行选择查询以返回一行(或更多)时,它将返回例如: 当查询失败时(例如,如果我使用错误的语法),它将返回FALSE。 但是,如果在查询中未找到任何行,则它还会返回FALSE。 因此,查询中有错误且没有行的返回值都将返回FALSE。那怎么可能?仅当查询中有错误时,我才需要返回FALSE,例如,当没有结果时,我就需要返回NULL。我的功能有问题吗? 谢谢! 问题答

  • 问题内容: 我正在使用一个API,该API声称如果成功则返回true,如果失败则返回false。但是,它也声称如果失败,则抛出不同的异常。它如何返回false并引发异常? 问题答案: 不能从单个函数调用中引发异常并返回值。 如果发生错误,它可能会执行类似返回的操作,但是如果输入无效,则会引发异常。 编辑:PaulPRO发布了一个(现已删除)答案,指出从 技术上讲, 有可能在返回当前值时在另一个线程

  • 如您所见,它将参数和的和保存在变量中,然后将包含它们的和的eax寄存器保存在变量中,就像函数返回值一样。 这样做是因为函数是用返回值定义的吗?

  • 问题内容: 如何从异步函数返回值?我试图喜欢这个 它给了我, 问题答案: 您不能超出范围。为了获得预期的结果,您应该将其包装到异步IIFE中,即 样品。 有关更多信息 由于返回一个Promise,因此可以将其省略,如下所示: 然后像以前一样做

  • 问题内容: 在SO中多次问过这个问题。但是我还是收不到东西。 我想从回调中获得一些价值。请看下面的脚本进行澄清。 如果我尝试返回该值,则只是“未定义”。我遵循了SO的一些想法,但仍然失败。 那些是: 问题答案: 这是不可能的,因为您无法从同步方法内部的异步调用返回。 在这种情况下,您需要将回调传递给foo,该回调将接收返回值 问题是,如果内部函数调用是异步的,则所有“包装”此调用的函数也必须是异步