sourcecode

Python에서 "try" 문의 옵션인 "else" 절의 용도는 무엇입니까?

copyscript 2022. 9. 26. 21:55
반응형

Python에서 "try" 문의 옵션인 "else" 절의 용도는 무엇입니까?

인 '''의 는 무엇입니까?elsetry★★★★★★★★★★★★?

「 」의 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하겠습니다.

  1. 두 번째 수술은 예외가 없는 경우에만 실행됩니다
  2. 에 달리다finally block, 및
  3. 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★★★★★★ 。

다른 답은 마지막 부분을 놓쳤다.

문서에서:

인 theelse제어가 종료된 경우 및 종료된 시점에서 절이 실행됩니다.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-elsePEP 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 참조를 보면elsetry예외는 없을 때.옵션의 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

반응형