C++ 有没有更好的方法来处理异常?试一试抓块真难看

C++ 有没有更好的方法来处理异常?试一试抓块真难看,c++,exception,nlohmann-json,C++,Exception,Nlohmann Json,我阅读并发现处理异常非常重要,我使用了nlohmann::json(from),我的大多数成员函数中几乎都使用了nlohmann::json::parse和nlohmann::json::dump,如果输入有问题,它们就有机会抛出异常 所以我需要处理这些抛出异常的机会,比如: bool my_class::function(const std::string&input)const 尝试 { 使用名称空间nlohmann; const auto result=json::parse(输入); c

我阅读并发现处理异常非常重要,我使用了
nlohmann::json
(from),我的大多数成员函数中几乎都使用了
nlohmann::json::parse
nlohmann::json::dump
,如果输入有问题,它们就有机会抛出异常

所以我需要处理这些抛出异常的机会,比如:

bool my_class::function(const std::string&input)const
尝试
{
使用名称空间nlohmann;
const auto result=json::parse(输入);
const auto name=result[“name”].dump();
/*而且*/
}
捕获(const std::exception&e)
{
/*处理异常*/
}
但我想知道哪一行代码抛出异常,所以如果我写这样的东西:

bool my_class::function(const std::string&input)const
{
使用名称空间nlohmann;
尝试
{
const auto result=json::parse(输入);
}
捕获(const std::exception&e)
{
/*处理异常*/
}
尝试
{
const auto name=result[“name”].dump();
}
捕获(const std::exception&e)
{
/*处理异常*/
}
/*而且*/
}
它给我留下了数千个试抓块。为什么处理异常更好

我会这样说: 设置一个“序列指针”来保存您试图解析的位置/内容的记录,比如使用一个模式为的字符串来解析…,这样您就可以知道/通知json中错误元素的确切位置

在下面的例子中,如果“name是错误的,那么r保存着“tryingtoparse name”的值,因此在异常中,您可以获得关于导致问题的json元素的信息:)


正如您可能注意到的,C++没有可用的信息。@웃Пepeúpaツ 提供了一些很好的解决方法

让我提供一些其他观点,作为您程序的最终用户,我对程序失败的代码行不感兴趣。我提供的JSON要么是正确的,要么是错误的。在第二种情况下,我想知道我需要做什么来修复JSON。看看定义异常,这看起来非常详细d

当您对它感兴趣的时候,您在程序中编写了一个bug,并且遇到了意外错误。此时,您最好将调试器附加到您的程序中,并在抛出任何异常时进行单步调试。这将不仅提供行号,还提供堆栈上的所有可用信息。.. 我可以建议您在代码上编写单元测试,这样您就有了需要调试的小块代码。理想情况下,如果您的程序中仍然遇到未发现的错误,您甚至可以将失败案例减少到新的单元测试

最后,性能的细节。需要更多的细节。这个收集是有代价的。在其他编程语言中,像java一样,你可以向你的异常请求一个调用栈,C++中,例外是在它的最小限度。尽管跟踪一个行号可能不那么昂贵,但是它确实需要额外的。最终用户不需要的装配说明


简而言之,该语言没有提供一种方便的方法来获取行号。这是因为有更好的方法来获取这些信息和更多信息:您的调试器。

我更喜欢第一种方法,第二种方法在范围界定方面有很多问题,您使程序的实际意图无法理解为什么需要json所在的代码行op失败?catch块中的“what”信息不够吗?堆栈跟踪不应该包含引发异常的行的信息吗?@ΦXocę웃Пepeúpaツ, 否,因为如果我使用
nlohmann::json::dump()
在我的函数中多次出现,其中一个抛出异常我无法确定是哪一个抛出异常。@Nextar,我想在运行时捕获它们并给用户一条正确的消息。您可能想将r更改为
常量字符*
,这样成本就会降低,假设您拥有所有字符串文本。谢谢您的建议,这例如,op可以根据自己的需要优化代码!同意,如果您只需要行号,也可以使用int和
\uuuu LINE\uuuu
。同时,它可以防止复制粘贴错误。
@ΦXocę웃Пepeúpaツ在第一行?发布其他答案的用户:
bool my_class::function(const std::string& input) const
{
    std::string r{""};
    try
    {
        using namespace nlohmann;
        r="trying to parse input";
        const auto result = json::parse(input);

        r="trying to parse name";
        const auto name = result["name"].dump();

        r="trying to parse age";
        const auto age = result["age"].dump();

        /* and ... */
    }
    catch (const std::exception& e)
    {
        /* handle exception */
    }
}