curl_easy_init失败时如何获取错误原因

问题描述 投票:1回答:1

errno失败时,是否可能获得错误代码(如curl_easy_strerror)或错误描述(如curl_easy_init)?

c++ c libcurl
1个回答
3
投票

不,这是不可能的。从库的7.58.0版的源代码...

struct Curl_easy *curl_easy_init(void) {
    CURLcode result;
    struct Curl_easy *data;

    // Etc..

    result = Curl_open(&data);
    if (result) {
        DEBUGF(fprintf(stderr, "Error: Curl_open failed\n"));
        return NULL;
    }

    return data;
}

正如您所看到的,如果Curl_open(...)失败,则库只会输出错误并中止:它不会修改任何状态变量,例如errno,您可以稍后检查这些变量以确定失败的原因。

但是,如果呼叫失败,可能是因为curl_global_init()失败了。如果你事先没有自己打电话,curl_easy_init()会自动调用它。 curl_global_init() - 与curl_easy_init()不同 - 实际上确实返回错误代码。

故事的道德启示 ... 在调用curl_global_init(...)之前调用curl_easy_init()并检查其返回值。不要依赖curl_easy_init()自动完成它。

这至少可以让你辨别curl_global_init(...)Curl_open()是否失败。

EG

CURLcode res = curl_global_init(CURL_GLOBAL_ALL);
if (res != 0) {
    fprintf("Failed global init ...\n");
    exit(1);
}
CURL *curl = curl_easy_init();
if (!curl) {
    ///
}

// Etc.

curl_easy_cleanup(curl);
curl_global_cleanup();
© www.soinside.com 2019 - 2024. All rights reserved.