当errno
失败时,是否可能获得错误代码(如curl_easy_strerror
)或错误描述(如curl_easy_init
)?
不,这是不可能的。从库的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();