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