我的应用程序(Ruby 1.9.2)可能会引发不同的异常,包括网络连接中断.我rescue Exception => e,然后case/when以不同的方式处理它们,但是几个错误直接通过我的案例else.
rescue Exception => e
p e.class
case e.class
when Errno::ECONNRESET
p 1
when Errno::ECONNRESET,Errno::ECONNABORTED,Errno::ETIMEDOUT
p 2
else
p 3
end
end
Run Code Online (Sandbox Code Playgroud)
打印:
Errno::ECONNRESET
3
Run Code Online (Sandbox Code Playgroud) 我有两种不同方法的调用:
void func1()
{
// do something
if (fail)
{
// then set errno to EEXIST
}
}
Run Code Online (Sandbox Code Playgroud)
第二种方法:
void func2()
{
// do something
if (fail)
{
// then set errno to ENOENT
}
}
Run Code Online (Sandbox Code Playgroud)
当我设置errno为某个值时,它会做什么?只是错误检查?
我怎样才能设置errno在上面的方法func1,并func2以EEXIST和ENOENT
谢谢
只是好奇.哪些系统提供EAGAIN和EWOULDBLOCK #define它们作为不同的值?
另一个简单例子:
if (wpa_s->mlme.ssid_len == 0)
return -EINVAL;
Run Code Online (Sandbox Code Playgroud)
为什么一元减去?对于在成功时返回> 0且在失败时返回<(=)0的函数,这(通常)是否完成,还是有其他原因?
我遇到了一个相当复杂的Python模块,它不会返回有用的错误代码(它实际上无法安静地失败).但是,它调用的底层C库设置了errno.
通常errno来自OSError属性,但由于我没有异常,我无法得到它.
使用ctypes,libc.errno不起作用,因为errno是GNU libc中的一个宏.Python 2.6有一些功能,但Debian仍然使用Python 2.5.将C模块插入我的纯Python程序只是为了阅读errno令我感到厌恶.
有没有办法访问errno?只有Linux的解决方案很好,因为被包装的库是仅限Linux的.我也不必担心线程,因为我在运行失败的时候只运行一个线程.
如果系统调用函数失败,我们通常使用perror来输出错误消息.我想使用fprintf输出perror字符串.我该怎么做这样的事情:
fprintf(stderr, perror output string here);
Run Code Online (Sandbox Code Playgroud) 我有一个由主服务器和分布式从服务器组成的程序.从属服务器向服务器发送状态更新,如果服务器在固定时间内没有从特定从属设备收到消息,则它将从属设备标记为关闭.这种情况一直在发生.
通过检查日志,我发现从服务器只能向服务器发送一个状态更新,然后永远不能发送另一个更新,总是无法调用connect()"无法分配请求的地址(99).
奇怪的是,从服务器能够向服务器发送多个其他更新,并且所有连接都发生在同一端口上.似乎这种失败的最常见原因是连接处于打开状态,但我无法找到任何未解决的问题.还有其他可能的解释吗?
为了澄清,这是我如何连接:
struct sockaddr *sa; // parameter
size_t sa_size; //parameter
int i = 1;
int stream;
stream = socket(AF_INET,SOCK_STREAM,0);
setsockopt(stream,SOL_SOCKET,SO_REUSEADDR,&i,sizeof(i));
bindresvport(stream,NULL);
connect(stream,sa,sa_size);
Run Code Online (Sandbox Code Playgroud)
此代码用于获取与另一个服务器的连接,并且这4个调用中的任何一个失败都会导致该函数失败.
C有perror和errno,它打印并存储遇到的最后一个错误.这在执行文件io时很方便,因为我不必将fstat()作为fopen()参数失败的每个文件向用户提供调用失败的原因.
我想知道在python中优雅地处理IOError异常时获取errno的正确方法是什么?
In [1]: fp = open("/notthere")
---------------------------------------------------------------------------
IOError Traceback (most recent call last)
/home/mugen/ in ()
IOError: [Errno 2] No such file or directory: '/notthere'
In [2]: fp = open("test/testfile")
---------------------------------------------------------------------------
IOError Traceback (most recent call last)
/home/mugen/ in ()
IOError: [Errno 13] Permission denied: 'test/testfile'
In [5]: try:
...: fp = open("nothere")
...: except IOError:
...: print "This failed for some reason..."
...:
...:
This failed for some reason...
我正在尝试使用套接字编写一个文件传输程序.代码的服务器端运行正常.但是,在客户端,我收到以下错误
Traceback (most recent call last):
File "client.py", line 54, in <module>
uploadFiles(directory)
File "client.py", line 36, in uploadFiles
transferFile(fname)
File "client.py", line 13, in transferFile
cs.connect((HOST, 36258))
File "/usr/lib/python2.7/socket.py", line 224, in meth
return getattr(self._sock,name)(*args)
socket.error: [Errno 111] Connection refused
Run Code Online (Sandbox Code Playgroud)
我的代码如下
import os
import socket
def transferFile(fname):
HOST = '127.0.0.1'
CPORT = 36258
MPORT = 36250
FILE = fname
cs = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
cs.connect((HOST, 36258))
cs.send("SEND " + FILE)
cs.close()
ms = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
ms.connect((HOST, MPORT))
f = open(FILE, …Run Code Online (Sandbox Code Playgroud) 我在SO"低质量"帖子中查看以下代码以确保样本有效,我的问题是为什么我不能打印errno的值?
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
int main(){
FILE *fp;
errno = 0;
fp=fopen("Not_exist.txt","r");
if(fp == NULL && errno == ENOENT)
perror("file not exist");
return 0;
}
Run Code Online (Sandbox Code Playgroud)
以下是我尝试打印值时发生的情况:
(gdb) p errno
Cannot find thread-local variables on this target
(gdb)
Run Code Online (Sandbox Code Playgroud)
我可以很好地打印fp的值.正如您所料,它的价值在于0x00.
我看了/usr/include/errno.h很多其他包含文件作为其中的一部分errno.h,我无法弄清楚如何定义errno.任何指针或帮助将不胜感激.我只是好奇它; 什么都没有打破.
谢谢.