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

How to get error reason when curl_easy_init fails

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

没有。不可能得到原因。来自 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() - 实际上 return 一个错误代码。

故事的寓意...
在调用 curl_easy_init() 之前调用 curl_global_init(...) 并检查它的 return 值。不要依赖 curl_easy_init() 自动执行。

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

例如

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();