如果您只是想尝试 - 除非不处理异常,您如何在Python中执行此操作?
以下是正确的方法吗?
try:
shutil.rmtree(path)
except:
pass
Run Code Online (Sandbox Code Playgroud) 我有一个循环开始for i in range(0, 100).通常它运行正常,但有时它会因网络状况而失败.目前我设置它以便在失败时,它将continue在except子句中(继续到下一个数字i).
我是否可以重新分配相同的数字i并再次运行循环的失败迭代?
这是一些表现特殊的代码.这是我编写的行为的简化版本.这仍然会表现出奇怪的行为,并且我对于为什么会这样做有一些具体的问题.
我在Windows 7上使用Python 2.6.6.
def demo1():
try:
raise RuntimeError,"To Force Issue"
except:
return 1
else:
return 2
finally:
return 3
def demo2():
try:
try:
raise RuntimeError,"To Force Issue"
except:
return 1
else:
return 2
finally:
return 3
except:
print 4
else:
print 5
finally:
print 6
Run Code Online (Sandbox Code Playgroud)
结果:
>>> print demo1()
3
>>> print demo2()
6
3
Run Code Online (Sandbox Code Playgroud)
下面有一些有趣的代码:
def func1():
try:
return 1
finally:
return 2
def func2():
try:
raise ValueError()
except:
return 1
finally:
return 3
func1()
func2()
Run Code Online (Sandbox Code Playgroud)
可以请有人解释,结果将返回这两个函数并解释原因,即描述执行的顺序
是否有可能尝试 - 除了捕获所有仍然显示错误而不捕获每个可能的异常?我有一个案例,在每天24小时运行的脚本中,每隔几天就会发生一次异常.我不能让脚本死掉,但它们也没关系,因为只要我尝试除了一切,它都会重试.因此,当我追踪任何最后罕见的异常时,我想将它们记录到文件中以供将来调试.
例:
try:
print(555)
except:
print("type error: "+ str(the_error))
Run Code Online (Sandbox Code Playgroud)
the_error有没有什么方法可以替换堆栈跟踪或类似的东西?
如何在try/except块public中创建变量?
import urllib.request
try:
url = "http://www.google.com"
page = urllib.request.urlopen(url)
text = page.read().decode('utf8')
except (ValueError, RuntimeError, TypeError, NameError):
print("Unable to process your request dude!!")
print(text)
Run Code Online (Sandbox Code Playgroud)
此代码返回错误__CODE__.
如何在try/except块之外使变量文本可用?
以下代码作为示例:
procedure TForm1.Button1Click(Sender: TObject);
var
Obj: TSomeObject;
begin
Screen.Cursor:= crHourGlass;
Obj:= TSomeObject.Create;
try
// do something
finally
Obj.Free;
end;
Screen.Cursor:= crDefault;
end;
Run Code Online (Sandbox Code Playgroud)
如果在该// do something部分中发生错误,我创建的TSomeObject将不会被释放,并且Screen.Cursor仍然会被卡在一个小时玻璃中,因为代码在进入这些行之前已经被破坏了?
现在除非我误会,否则应该有一个异常声明来处理任何错误的发生,例如:
procedure TForm1.Button1Click(Sender: TObject);
var
Obj: TSomeObject;
begin
try
Screen.Cursor:= crHourGlass;
Obj:= TSomeObject.Create;
try
// do something
finally
Obj.Free;
end;
Screen.Cursor:= crDefault;
except on E: Exception do
begin
Obj.Free;
Screen.Cursor:= crDefault;
ShowMessage('There was an error: ' + E.Message);
end;
end;
Run Code Online (Sandbox Code Playgroud)
现在除非我做了一些非常愚蠢的事情,否则应该没有理由在Finally块和之后以及在Exception块中两次使用相同的代码.
基本上我有时会有一些程序可能类似于我发布的第一个样本,如果我收到错误,光标会被卡在小时玻璃上.添加Exception处理程序会有所帮助,但它似乎是一种肮脏的方式 - 它基本上忽略了Finally块,更不用说从Finally到Exception部分的复制粘贴的丑陋代码.
如果这似乎是一个直截了当的问题/答案,我仍然非常学习德尔福.
如何正确编写代码来处理语句并正确释放对象和捕获错误等?
有时您不希望在部件中放置任何代码,except因为您只是希望确保代码运行时没有任何错误但是没有兴趣捕获它们.我可以在C#中这样做:
try
{
do_something()
}catch (...) {}
Run Code Online (Sandbox Code Playgroud)
我怎么能在Python中做到这一点?,因为缩进不允许这样做:
try:
do_something()
except:
i_must_enter_somecode_here()
Run Code Online (Sandbox Code Playgroud)
顺便说一句,也许我在C#中所做的事情也不符合错误处理原则.如果你对此有所了解,我会很感激.
做一些API测试并尝试创建一个给定输入URL的函数它将返回json响应,但是如果HTTP错误是响应,则将返回错误消息.
我之前使用的是urllib2,但现在尝试使用请求.但是看起来我的except块永远不会被执行,无论错误如何.
testURL = 'http://httpbin.org/status/404'
def return_json(URL):
try:
response = requests.get(URL)
json_obj = response.json()
return json_obj
except requests.exceptions.HTTPError as e:
return "Error: " + str(e)
Run Code Online (Sandbox Code Playgroud)
我从运行上面得到的结果......
<Response [404]>
Run Code Online (Sandbox Code Playgroud) 我有几个可能保存我的数据的文件; 它们可以以不同的方式压缩,因此要打开它们我需要使用file(),gzip.GzipFile()而其他也返回文件对象(支持with接口).
我想尝试每一个,直到一个成功开放,所以我可以做类似的事情
try:
with gzip.GzipFile(fn + '.gz') as f:
result = process(f)
except (IOError, MaybeSomeGzipExceptions):
try:
with xCompressLib.xCompressFile(fn + '.x') as f:
result = process(f)
except (IOError, MaybeSomeXCompressExceptions):
try:
with file(fn) as f:
result = process(f)
except IOError:
result = "some default value"
Run Code Online (Sandbox Code Playgroud)
如果我有几十个可能的压缩变体,这显然是不可行的.(嵌套将越来越深,代码看起来总是非常相似.)
有没有更好的拼写方法?
编辑:如果可能的话,我希望process(f)除了try/except以外,以避免意外捕获在中提出的异常process(f).
try-except ×10
python ×9
exception ×3
python-3.x ×2
try-finally ×2
delphi ×1
loops ×1
nested ×1
scope ×1
try-catch ×1