浏览一些遗留代码,我遇到一些“空”的 except 块。它们都是出于类似的原因而实现的,即处理从 TEdit 中的文本到数值的转换。由于 TEdit 可能为空,因此在这种情况下不应出现错误消息:
procedure TmyForm.EditExit(Sender: TObject);
begin
...
try
_value := StrToFloat(Edit.Text);
except
end;
...
end;
Run Code Online (Sandbox Code Playgroud)
这很有效,但我想这并不是一个好的做法。有没有更好的方法来获得相同的行为?
我在StackOverflow上看到过此代码:
with TDownloadURL.Create(nil) do
try
URL := 'myurltodownload.com';
filename := 'locationtosaveto';
try
ExecuteTarget(nil);
except
result := false;
end;
if not FileExists(filename) then
result := false;
finally
free;
end;
Run Code Online (Sandbox Code Playgroud)
不能简化为:
Result:= FALSE; <--------- Compiler complains
DeleteFile(Dest);
dl:= TDownloadURL.Create(NIL);
TRY
dl.URL:= URL;
dl.FileName:= Dest;
dl.ExecuteTarget(NIL);
Result:= FileExists(Dest);
FINALLY
dl.Free;
END;
Run Code Online (Sandbox Code Playgroud)
如果"ExecuteTarget"出现问题,最终的结果:= ...将永远不会执行,因为程序将直接跳转到"finally".对?因此,该函数将返回FALSE.难道我做错了什么?
PS:
我正在研究一些连接到sqlite数据库的代码.在调试所述代码的过程中,我遇到的问题是我挂起了与数据库的连接,因为某些错误阻止了执行close命令.因为db和c是在函数中定义的,所以我无法从命令行中找到并关闭这些对象.他们就像孤儿连接或什么的,但在任何情况下,他们阻止我做任何事情都要与数据库中,直到我关闭并重新打开我的交互式控制台.这是它的样子:
def something()
db=sqlite3.connect('mydatabase')
c=db.cursor()
somecode
lots of different things happening in here
this may have errors
thus stopping execution
db.commit()
c.close()
db.close()
Run Code Online (Sandbox Code Playgroud)
我尝试了一个try/except子句,最后关闭操作在"finally"块中,但这可以防止异常在我调试时被提升回交互式输出,并且事情"无声地"失败(也许我不是做那个部分吧?)有一个更好的方法吗?
我试图弄清楚如何使用try和除外捕获空用户输入.如果你有这个例子:
try:
#user input here. integer input
except ValueError:
#print statement saying empty string.
Run Code Online (Sandbox Code Playgroud)
虽然我还需要捕获另一个值错误,以确保它们输入一个整数,而不是字符或字符串,我怎么能使用if和elif设置,以确定它是一个空字符串或str而不是int
RE:如何正确编写Try..Finally..Except语句?
我仍然对OP的原始问题感到困惑.具体来说,该过程的最后一行(在try..finally..end之外)读取"Screen.Cursor:= crDefault".
我的理解是,一个try..except内提出的任何异常| finally..end块WILL的的"尝试","结束"后执行代码.
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)
在上面的例子中,我没有看到为什么"Screen.Cursor:= crDefault"不会被执行的任何原因.如果我错了,请纠正我.
作为另一个例子,我编译了这一小段代码来帮助说明.运行代码时,将显示三(3)个ShowMessage()对话框.第一个"Exception Raised"和第二个"finally"和第三个"结束".
procedure TForm1.Button1Click(Sender: TObject);
begin
try
try
showMessage(format('%s', [12]));
except
showMessage('Exception raised');
end;
finally
showMessage('finally');
end;
showMessage('at end');
end;
Run Code Online (Sandbox Code Playgroud)
所以,我很困惑为什么他的"Screen.Cursor:= crDefault"没有被运行,原因是它的原始形式和代码.有人可以详细说明吗?
我正在尝试try...except在下面的代码中实现异常处理。当输入类似“ s4”的内容时,我希望出现“非数字值...”的输出。
关于我哪里出问题了吗?
import string
import math
def getSqrt(n):
return math.sqrt(float(n))
s = input("Enter a numerical value: ")
try:
for i in s:
if (i.isdigit() or i == "."):
sType = "nonstr"
if (sType =="nonstr"):
print(getSqrt(s))
else:
s = "Non numberical value..."
except ValueError as ex:
print(ex)
else:
print(s)
Run Code Online (Sandbox Code Playgroud) 我想以最优雅的Python方式实现的目标:尝试在某个过滤器上查找数据库中的对象.只有在没有结果的情况下,才尝试使用其他过滤器查找对象.如果没有返回结果,则该对象不存在,因此插入一个新实例.
我在想什么:
try:
obj = session.query(model).filter_by(field_a).one()
except NoObjFound:
try:
obj = session.query(model).filter_by(field_b).one()
except NoObjFound:
insert_into_db(brand_new_obj)
else:
update_the_obj(obj)
Run Code Online (Sandbox Code Playgroud)
我不确定这个块是否正确或是处理我想要完成的事情的最佳方法.
我是一个相对的python新手,我对如何正确处理异常感到困惑。对于这个愚蠢的问题表示歉意。
在main()中,我遍历日期列表,并为每个日期调用一个函数,该函数从公共Web服务器下载csv文件。由于明显的原因,我想适当地捕获异常,但尤其是因为我不知道何时可以下载感兴趣的文件。我的程序将作为cron作业的一部分执行,并且将尝试每3小时下载一次这些文件(如果有)。
我想要的是下载日期列表中的第一个文件,如果结果为404,则该程序不应继续处理下一个文件,因为假设是如果列表中最旧的日期不可用,则没有一个之后的其他版本也将可用。
我有以下python伪代码。我在尝试下载文件的函数中有try / except块,但是如果函数中发生异常,我该如何在main()中正确处理它,以便我可以决定是否继续进行下一个日期。之所以创建一个执行下载的功能的原因是,我想稍后在同一main()块中针对其他文件类型重用该代码。
def main():
...
...
# datelist is a list of date objects
for date in datelist:
download_file(date)
def download_file(date):
date_string = str(date.year) + str(date.strftime('%m')) + str(date.strftime('%d'))
request = HTTP_WEB_PREFIX+ date_string + FILE_SUFFIX
try:
response = urllib2.urlopen(request)
except urllib2.HTTPError, e:
print "HTTPError = " + str(e)
except urllib2.URLError, e:
print "URLError = " + str(e)
except httplib.HTTPException, e:
print "HTTPException = " + str(e)
except IOError:
print "IOError = " + str(e)
except Exception:
import …Run Code Online (Sandbox Code Playgroud) 假设我有一个代码片段如下
r = requests.post(url, data=values, files=files)
Run Code Online (Sandbox Code Playgroud)
由于这是在发出网络请求,因此可以从此行抛出一堆异常.为了完整的论点,我也可以有文件读取,发送电子邮件等.为了遇到这样的错误我做
try:
r = requests.post(url, data=values, files=files)
if r.status_code != 200:
raise Exception("Could not post to "+ url)
except Exception as e:
logger.error("Error posting to " + url)
Run Code Online (Sandbox Code Playgroud)
我用这种方法看到了两个问题.
我想知道在python中处理异常的最佳方法是什么.
我有一些Python代码如下:
for emailCredentials in emailCredentialsList:
try:
if not emailCredentials.valid:
emailCredentials.refresh()
except EmailCredentialRefreshError as e:
emailCredentials.active = False
emailCredentials.save()
# HERE I WANT TO STOP THIS ITERATION OF THE FOR LOOP
# SO THAT THE CODE BELOW THIS DOESN'T RUN ANYMORE. BUT HOW?
# a lot more code here that scrapes the email box for interesting information
Run Code Online (Sandbox Code Playgroud)
正如我已经在代码中注释的那样,如果EmailCredentialRefreshError抛出,我希望for循环的这个迭代停止并移动到下一个项目emailCredentialsList.我不能使用a,break因为这将停止整个循环,它不会覆盖循环中的其他项目.我当然可以将所有代码包装在try/except中,但我希望将它们保持在一起以便代码保持可读性.
解决这个问题的最恐怖的方法是什么?
try-except ×10
python ×7
delphi ×3
exception ×2
try-finally ×2
break ×1
idempotent ×1
loops ×1
nested ×1
sqlite ×1
structure ×1
try-catch ×1