Python에서 "try" 문의 옵션인 "else" 절의 용도는 무엇입니까?
인 '''의 는 무엇입니까?else
의 try
★★★★★★★★★★★★?
「 」의 else
실행이 바닥에서 떨어지면 블록이 실행됩니다.try
. - 예외는 없습니다. - 예외는 없습니다.솔히 、 난난 、 을못을을어 。
단, 예외 처리 주의사항:
else 구를 사용하면 try 구에 코드를 추가하는 것보다 더 좋습니다. 왜냐하면 try에 의해 보호되는 코드에 의해 발생하지 않은 예외가 우연히 포착되는 것을 방지할 수 있기 때문입니다.스테이트먼트를 제외합니다.
예를 수 있는 , 던질 수 있는 방법이 ,IOError
발생하는 예외를 검출하고 싶지만 첫 번째 조작이 성공했을 때 그 조작으로 IOError를 검출하지 않으면 다음과 같이 기술할 수 있습니다.
try:
operation_that_can_throw_ioerror()
except IOError:
handle_the_exception_somehow()
else:
# we don't want to catch the IOError if it's raised
another_operation_that_can_throw_ioerror()
finally:
something_we_always_need_to_do()
★★★★★★★★★★★★★★★★★★★★★★★★★another_operation_that_can_throw_ioerror()
후에operation_that_can_throw_ioerror
, . . . . . . . .except
두 번째 콜의 오류를 검출합니다. 그 try
, 그에 실행이 .finally
. 。else
하겠습니다.
- 두 번째 수술은 예외가 없는 경우에만 실행됩니다
- 에 달리다
finally
block, 및 IOError
서 안.
사용해야 할 큰 이유가 하나 있다.else
- 가독성.예외를 일으킬 수 있는 코드를 취급하는 코드 근처에 보관하는 것이 좋습니다.를를,, 음음음음음음음음
try:
from EasyDialogs import AskPassword
# 20 other lines
getpass = AskPassword
except ImportError:
getpass = default_getpass
그리고.
try:
from EasyDialogs import AskPassword
except ImportError:
getpass = default_getpass
else:
# 20 other lines
getpass = AskPassword
요.except
조기 복귀나 예외를 재투입할 수 없습니다.능면면면, 음음음음음음음음음 음음음음음음음
try:
from EasyDialogs import AskPassword
except ImportError:
getpass = default_getpass
return False # or throw Exception('something more descriptive')
# 20 other lines
getpass = AskPassword
주의: 최근 투고된 복제에서 복사한 답변이므로 이 모든 "Ask Password" 내용은 여기에 있습니다.
파이썬 트라이엘스
인 '''의 는 무엇입니까?
else
스테이트먼트의?try 테테 먼테 clause clause clause clause clause clause?
처리될 것으로 예상되는 예외가 없는 경우 더 많은 코드를 실행할 수 있는 컨텍스트를 사용하는 것이 목적입니다.
이 컨텍스트는 예기치 않은 오류를 실수로 처리하는 것을 방지합니다.
것이 합니다.return
,continue
, , , , 입니다.break
의 할 수 .else
.
개요
else
예외가 없는 경우 및 에 의해 중단되지 않은 경우 스테이트먼트가 실행됩니다.return
,continue
, 「」break
★★★★★★ 。
다른 답은 마지막 부분을 놓쳤다.
인 the
else
제어가 종료된 경우 및 종료된 시점에서 절이 실행됩니다.try
절을 클릭합니다.*
(볼드 추가)그리고 각주에는 다음과 같이 적혀 있다.
* flows off end를 를 실행하고 있습니다
return
,continue
, 「」break
★★★★★★ 。
이 명령어에는 적어도1개의 선행절(문법 참조)이 필요합니다.즉, "try-else"가 아니라 "try-except-else(-finally)"입니다.else
(그리고)finally
는 옵션입니다.
Python Tutorial에서는 의도된 용도에 대해 자세히 설명합니다.
그 시도는...except 스테이트먼트에는 옵션인 else 구가 있습니다.이 구가 있는 경우 해당 구를 제외한 모든 구 뒤에 와야 합니다.try 절이 예외를 발생시키지 않을 경우 실행해야 하는 코드에 유용합니다.예를 들어 다음과 같습니다.
for arg in sys.argv[1:]: try: f = open(arg, 'r') except IOError: print 'cannot open', arg else: print arg, 'has', len(f.readlines()), 'lines' f.close()
else 구를 사용하면 try 구에 코드를 추가하는 것보다 더 좋습니다. 왜냐하면 try에 의해 보호되는 코드에 의해 발생하지 않은 예외가 우연히 포착되는 것을 방지할 수 있기 때문입니다.스테이트먼트를 제외합니다.
「」의 의 예else
try
하면, 「」는else
블록이 실행되지 않습니다.예를 들어 다음과 같습니다.
def handle_error():
try:
raise RuntimeError('oops!')
except RuntimeError as error:
print('handled a RuntimeError, no big deal.')
else:
print('if this prints, we had no error!') # won't print!
print('And now we have left the try block!') # will print!
그리고 이제...
>>> handle_error()
handled a RuntimeError, no big deal.
And now we have left the try block!
한 가지 용도: 예외를 발생시키는 코드를 테스트합니다.
try:
this_should_raise_TypeError()
except TypeError:
pass
except:
assert False, "Raised the wrong exception type"
else:
assert False, "Didn't raise any exception"
(이 코드는 실제로는 보다 일반적인 테스트로 추상화해야 합니다.)
Try-except-else는 EAFP 패턴과 덕타이핑의 조합에 매우 적합합니다.
try:
cs = x.cleanupSet
except AttributeError:
pass
else:
for v in cs:
v.cleanup()
이 순진한 코드는 정상이라고 생각할 수 있습니다.
try:
for v in x.cleanupSet:
v.clenaup()
except AttributeError:
pass
이것은 코드의 심각한 버그를 실수로 숨기는 좋은 방법입니다.거기서 cleanup을 입력했는데 Attribute Error가 삼켜지고 있습니다.게다가 올바르게 썼는데 정리 방법이 이름이 잘못된 속성을 가진 사용자 유형으로 전달되는 경우가 종종 있어서 중간에 오류가 발생하여 파일을 닫지 않은 채로 방치할 수도 있습니다.디버깅 잘해봐
청소가 필요한 경우 예외가 있더라도 이를 수행해야 할 때 매우 유용합니다.
try:
data = something_that_can_go_wrong()
except Exception as e: # yes, I know that's a bad way to do it...
handle_exception(e)
else:
do_stuff(data)
finally:
clean_up()
지금 당장은 그 용도를 생각할 수 없지만, 분명 그 용도가 있을 것이다.다음은 상상하기 어려운 샘플입니다.
★★★★★★★★★★★★★★★★ else
:
a = [1,2,3]
try:
something = a[2]
except:
print "out of bounds"
else:
print something
else
:
try:
something = a[2]
except:
print "out of bounds"
if "something" in locals():
print something
변수가 .something
은 빼도 돼요. 이 부분은 요.try
그러나 변수가 정의되어 있는 경우 다소 혼란스러운 검출이 필요합니다.
좋은 try-else
PEP 380에 기재되어 있습니다.기본적으로 알고리즘의 다른 부분에서 다른 예외 처리를 수행하는 것으로 귀결됩니다.
다음과 같습니다.
try:
do_init_stuff()
except:
handle_init_suff_execption()
else:
try:
do_middle_stuff()
except:
handle_middle_stuff_exception()
이를 통해 예외 처리 코드를 예외가 발생하는 곳 근처에 쓸 수 있습니다.
오류 및 예외 # 처리 예외 - 문서.python.org
try ... except
인 "이러다"가 .else
절(존재하는 경우)을 제외한 모든 절 뒤에 와야 합니다.시키지 않을 경우 에 도움이 .try는 예외입니다.예를 들어 다음과 같습니다.for arg in sys.argv[1:]: try: f = open(arg, 'r') except IOError: print 'cannot open', arg else: print arg, 'has', len(f.readlines()), 'lines' f.close()
else 구를 사용하면 try 구에 코드를 추가하는 것보다 더 좋습니다. 왜냐하면 try에 의해 보호되는 코드에 의해 발생하지 않은 예외가 우연히 포착되는 것을 방지할 수 있기 때문입니다.스테이트먼트를 제외합니다.
try:
statements # statements that can raise exceptions
except:
statements # statements that will be executed to handle exceptions
else:
statements # statements that will be executed if there is no exception
예:
try:
age=int(input('Enter your age: '))
except:
print ('You have entered an invalid value.')
else:
if age <= 21:
print('You are not allowed to enter, you are too young.')
else:
print('Welcome, you are old enough.')
출력:
>>>
Enter your age: a
You have entered an invalid value.
>>> RESTART
>>>
Enter your age: 25
Welcome, you are old enough.
>>>RESTART
>>>
Enter your age: 13
You are not allowed to enter, you are too young.
>>>
복사원: https://geek-university.com/python/the-try-except-else-statements/
Python 참조를 보면else
try
예외는 없을 때.옵션의 else 구는 try 절의 말미에 제어가 흐를 때 실행됩니다.2 else 절의 예외는 절을 제외하고 앞의 절에 의해 처리되지 않습니다.
Python에 뛰어들기 위한 예가 있습니다. 제가 제대로 이해했다면,try
만, 하면 block 「 「 Import 」로 .그것이 실패하면 예외와 바인드 디폴트를 얻을 수 있지만, 그것이 동작하면, import 할 수 있는 옵션이 있습니다.else
필요한 것을 차단하고 바인드합니다(예시와 설명은 링크를 참조하십시오).
에서 catch
또 예외가 수 거기서 가 생길 수 것 .else
블록은 편리합니다.
바로 그겁니다.try-except 절의 'else' 블록은 시도된 작업이 성공할 때(그리고 성공할 때만) 실행되는 코드에 대해 존재합니다.사용할 수도 있고 악용될 수도 있습니다.
try:
fp= open("configuration_file", "rb")
except EnvironmentError:
confdata= '' # it's ok if the file can't be opened
else:
confdata= fp.read()
fp.close()
# your code continues here
# working with (possibly empty) confdata
개인적으로는 마음에 들어 적당한 때에 사용하고 있습니다.의미론적으로 스테이트먼트를 그룹화합니다.
DB 세션을 처리할 때 간단해 보이는 다른 사용 사례를 추가합니다.
# getting a DB connection
conn = db.engine.connect()
# and binding to a DB session
session = db.get_session(bind=conn)
try:
# we build the query to DB
q = session.query(MyTable).filter(MyTable.col1 == 'query_val')
# i.e retrieve one row
data_set = q.one_or_none()
# return results
return [{'col1': data_set.col1, 'col2': data_set.col2, ...}]
except:
# here we make sure to rollback the transaction,
# handy when we update stuff into DB
session.rollback()
raise
else:
# when no errors then we can commit DB changes
session.commit()
finally:
# and finally we can close the session
session.close()
다음과 같은 용도가 있을 수 있습니다.
#debug = []
def debuglog(text, obj=None):
" Simple little logger. "
try:
debug # does global exist?
except NameError:
pass # if not, don't even bother displaying
except:
print('Unknown cause. Debug debuglog().')
else:
# debug does exist.
# Now test if you want to log this debug message
# from caller "obj"
try:
if obj in debug:
print(text) # stdout
except TypeError:
print('The global "debug" flag should be an iterable.')
except:
print('Unknown cause. Debug debuglog().')
def myfunc():
debuglog('Made it to myfunc()', myfunc)
debug = [myfunc,]
myfunc()
어쩌면 이게 당신을 유용하게 만들지도 몰라요.
★★★★★★를 찾았습니다.try: ... else:
데이터베이스 쿼리를 실행하고 이러한 쿼리 결과를 동일한 플레이버/유형의 다른 데이터베이스에 기록하는 경우에 유용합니다.큐에 .
#in a long running loop
try:
query = queue.get()
conn = connect_to_db(<main db>)
curs = conn.cursor()
try:
curs.execute("<some query on user input that may fail even if sanitized">)
except DBError:
logconn = connect_to_db(<logging db>)
logcurs = logconn.cursor()
logcurs.execute("<update in DB log with record of failed query")
logcurs.close()
logconn.close()
else:
#we can't put this in main try block because an error connecting
#to the logging DB would be indistinguishable from an error in
#the mainquery
#We can't put this after the whole try: except: finally: block
#because then we don't know if the query was successful or not
logconn = connect_to_db(<logging db>)
logcurs = logconn.cursor()
logcurs.execute("<update in DB log with record of successful query")
logcurs.close()
logconn.close()
#do something in response to successful query
except DBError:
#This DBError is because of a problem with the logging database, but
#we can't let that crash the whole thread over what might be a
#temporary network glitch
finally:
curs.close()
conn.close()
#other cleanup if necessary like telling the queue the task is finished
물론 발생할 수 있는 예외를 구별할 수 있다면 이 예외를 사용할 필요가 없습니다.그러나 성공한 코드 조각에 반응하는 코드가 성공한 코드 조각과 동일한 예외를 던질 수 있으며, 두 번째 가능한 예외를 그냥 넘어갈 수도 없고 성공했을 때 바로 되돌아갈 수도 없습니다(내 케이스의 스레드가 사라집니다).e) 그러면 편리합니다.
이 패턴을 사용하고 싶은 또 다른 장소는 다음과 같습니다.
while data in items:
try
data = json.loads(data)
except ValueError as e:
log error
else:
# work on the `data`
안else
은 보통 기능에서 하기 위해 할 수 있습니다.except
try:
test_consistency(valuable_data)
except Except1:
inconsistency_type = 1
except Except2:
inconsistency_type = 2
except:
# Something else is wrong
raise
else:
inconsistency_type = 0
"""
Process each individual inconsistency down here instead of
inside the except blocks. Use 0 to mean no inconsistency.
"""
「」는,inconsistency_type
는 블록 블록으로 되어 있기 없는 됩니다.else
.
물론, 나는 이것을 언젠가 당신 자신의 코드에 나타날 패턴이라고 묘사하고 있다.에는 그냥 '어울리다', '어울리다'로 설정하면 .inconsistency_type
앞에 이 되다try
차단할 수 있습니다.
생각할 수 있는 사용 시나리오 중 하나는 예측할 수 없는 예외입니다.이 예외는 다시 시도하면 회피할 수 있습니다.예를 들어, try block의 조작에 난수가 포함되어 있는 경우:
while True:
try:
r = random.random()
some_operation_that_fails_for_specific_r(r)
except Exception:
continue
else:
break
그러나 예외를 예측할 수 있는 경우에는 항상 예외보다 검증을 선택해야 합니다.그러나 모든 것을 예측할 수 있는 것은 아니기 때문에, 이 코드 패턴은 적절한 것이 있습니다.
else
하는 데 이 됩니다.예를 들어, 「 」, 「 」, 「 」, 「 」, 「 」, 「 」, 「 」, 「 」, 「 」, 「 」, 「 」, 「 」, 「 」입니다.
try:
value, unit = cfg['lock'].split()
except ValueError:
msg = 'lock monitoring config must consist of two words separated by white space'
self.log('warn', msg)
else:
# get on with lock monitoring if config is ok
로 읽다lock
하고 경고 메시지를 합니다.config.는 ValueErrors의 값입니다.
프로그래밍 로직이 사전에 지정된 키를 가진 항목이 있는지 여부에 따라 다르다고 가정합니다. 결과를 해 볼 수 .dict.get(key)
를 사용합니다.if... else...
을 사용하다
try:
val = dic[key]
except KeyError:
do_some_stuff()
else:
do_some_stuff_with_val(val)
은 ' 처리'에서수.finally
예외 없는 경우 다른 작업을 수행하면서 다음과 같이 입력합니다.
class TooManyRetries(RuntimeError):
pass
n_tries = 0
max_retries = 2
while True:
try:
n_tries += 1
if n_tries >= max_retries:
raise TooManyRetries
fail_prone_operation()
except Exception1 as ex:
# handle1
except Exception2 as ex:
# handle2
except Exception3 as ex:
# handle3
except TooManyRetries as ex:
raise
else: # No exception
n_tries = 0
finally:
common_restore_state()
continue
else:
이치노'아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, for
★★★★★★★★★★★★★★★★★」while
★★★★★★★★★★★★★★★★★★.
...if
- - ,else:
정말 끔찍한 방법으로 악용될 수 있어 찾기 힘든 버그를 만들 수 있습니다.
생각해 보세요.
if a < 10:
# condition stated explicitly
elif a > 10 and b < 10:
# condition confusing but at least explicit
else:
# Exactly what is true here?
# Can be hard to reason out what condition is true
한 번 해 보세요.else:
이치노if
- 및 그 를 고려합니다. - 문서화를 검토하십시오.else
. - 명시적 조건. - 명시적 조건. - 명시적 조건.
언급URL : https://stackoverflow.com/questions/855759/what-is-the-intended-use-of-the-optional-else-clause-of-the-try-statement-in
'sourcecode' 카테고리의 다른 글
데이터베이스 다이어그램 자동 생성 MySQL (0) | 2022.09.26 |
---|---|
입력 문자열에 javascript의 숫자가 포함되어 있는지 확인합니다. (0) | 2022.09.26 |
Panda는 데이터 프레임을 일련의 튜플로 변환합니다. (0) | 2022.09.26 |
LauncherFactory의 NoClassDefFoundError로 인해 JUnit 5를 사용하여 이클립스 테스트를 찾을 수 없습니다. (0) | 2022.09.26 |
MySQL Workbench를 사용하여 MariaDB를 생성할 수 있습니까? (0) | 2022.09.26 |