2013-06-06 2 views
0

이 간단한 예외 처리기를 실행하려고하는데 어떤 이유로 작동하지 않습니다. 예외를 throw하고 파일에 오류를 기록하려고합니다.기본 예외 처리

fileo = "C:/Users/bgbesase/Documents/Brent/ParsePractice/out.txt" 

g = 4 
h = 6 
try: 
    if g > h: 
     print 'Hey' 
except Exception as e: 
    f = open(fileo, 'w') 
    f.truncate() 
    f.write(e) 
    f.close() 
    print e 

내가 뭘 잘못하고 있는거야?

+4

예외가 발생하지 않았습니다. 예외 처리 코드는 코드가 예외를 던지거나 호출하는 메서드에 의해 예외가 발생하여 코드 메인 라인에서 예외가 발생할 때만 실행된다는 것을 알고 있습니까? –

답변

3

실제로 예외는 발생하지 않습니다. 예외를 발생 시키려면 Exception 클래스 또는 Exception 클래스의 인스턴스와 함께 raise 키워드를 사용해야합니다. 이 경우 불편을 끼쳐 드려서 ValueError을 권하고 싶습니다.

fileo = "C:/Users/bgbesase/Documents/Brent/ParsePractice/out.txt" 

g = 4 
h = 6 
try: 
    if g > h: 
     raise ValueError('Hey') 
except Exception as e: 
    f = open(fileo, 'w') 
    f.truncate() 
    f.write(str(e)) 
    f.close() 
    print e 
+0

좋습니다. 하지만 이제는 내 코드를 변경하여 코드가 올바르게 작동하지 않습니다. 매번 Exception 수업을 받아야합니까? – bbesase

+0

'g> h' 조건이'True'가 아니기 때문에 예외가 발생하지 않습니다. ('h> g') – mgilson

+0

'g> h' is not '사실입니다.'e'가 무엇인지보고 싶습니다. 그것을 내가 왜 잘못했는지 파일에 출력하십시오. – bbesase

5

스 니펫은 예외를 발생시키지 않습니다. 어쩌면 당신은

try: 
    if g > h: 
     print 'Hey' 
    else: 
     raise NotImplementedError('This condition is not handled here!') 
except Exception as e: 
    # ... 

또 다른 가능성처럼 뭔가를 당신이 말하는 의미 즉 원하는 :

try: 
    assert g > h 
    print 'Hey!' 
except AssertionError as e: 
    # ... 

assert 키워드는 기본적으로 같은 동작 "-실패 안전합니다." 조건이 거짓이면 AssertionError 예외가 발생합니다. 함수 인수에 대한 전제 조건을 확인하는 데 자주 사용됩니다. (예를 들어 값이 이해하기 위해 기능을 위해 0보다 커야합니다.)


편집 :

예외가 어떤 프로그램을 중단 코드에서 "신호"의 일종이다 가장 가까운 "예외 처리기"로 연결됩니다. 프로그램에서 예외가 발생할 때마다 모든 실행이 즉시 중단되고 코드의 가장 가까운 except: 섹션으로 이동하려고 시도합니다. 존재하지 않으면 프로그램이 충돌합니다. 다음 프로그램을 실행 해보십시오 :

print 'Hello. I will try doing a sum now.' 
sum = 3 + 5 
print 'This is the sum: ' + str(sum) 
print 'Now I will do a division!' 
quotient = 5/0 
print 'This is the result of that: ' + str(quotient) 

실행하면 프로그램이 충돌하는 것을 볼 수 있습니다. 내 파이썬에서 알려줍니다.

ZeroDivisionError: integer division or modulo by zero 

이것은 예외입니다! 예외적 인 무엇인가 일어났다! 물론 0으로 나눌 수는 없습니다. 여러분이 알다시피,이 예외는 가장 가까운 exception: 블록이나 예외 처리기으로가는 신호를 찾는 일종의 신호입니다. 이 프로그램을 다시 작성하여보다 안전합니다.

try: 
    print 'Hello. I will try doing a sum now.' 
    sum = 3 + 5 
    print 'This is the sum: ' + str(sum) 
    print 'Now I will do a division!' 
    quotient = 5/0 
    print 'This is the result of that: ' + str(quotient) 
except Exception as e: 
    print 'Something exceptional occurred!' 
    print e 

이제 우리 캐치를 제외하고, 뭔가 특별한 일이 있다는 신호. 신호를 변수 e에 넣고 출력합니다. 이제 프로그램이 ZeroDivisionError 예외가 발생하면

Something exceptional occurred! 
integer division or modulo by zero 

가 발생합니다, 그 지점에서 실행을 중지하고, 예외 핸들러로 바로 갔다. 원하는 경우 수동으로 예외를 발생시킬 수도 있습니다.

try: 
    print 'This you will see' 
    raise Exception('i broke your code') 
    print 'This you will not' 
except Exception as e: 
    print 'But this you will. And this is the exception that occurred:' 
    print e 

raise 키워드는 예외 신호를 수동으로 보냅니다.ZeroDivisionError 예외, AssertionError 예외, NotImplementedError 예외 및 기타와 같은 여러 종류의 예외가 있지만 추가 연구용으로 남겨 둡니다.

원래 코드에서 예외적 인 상황이 발생하지 않았으므로 예외가 발생하는 것을 결코 보지 못했습니다. 조건 (예 : g > h)을 기반으로 예외를 트리거하려는 경우 raise처럼 약간 동작하는 assert 키워드를 사용할 수 있지만 조건이 거짓 일 때만 예외가 발생합니다. 따라서 작성하는 경우

try: 
    print 'Is all going well?' 
    assert 3 > 5 
    print 'Apparently so!' 
except AssertionError as e: 
    print 'Nope, it does not!' 

"분명히!" 메시지는 어설 션이 거짓이고 예외를 트리거하기 때문에 발생합니다. 어설 션은 프로그램에서 값을 이해하고 현재 작업을 중단하려는 경우 유용하게 사용할 수 있습니다.

(예외 처리 코드에서 AssertionError을 명시 적으로 포착했음을 유의하십시오.이 예외는 다른 예외를 catch하지 않으며, 단지 AssertionError 초입니다. 예외 사항에 대해 계속 읽는다면이 문제는 즉시 해결 될 것입니다. 걱정하지 마십시오. 지금은 그들에 대해 많이 알고 있습니다.)

+0

나는 모두 혼란 스럽기 때문에, 내가하고 싶은 것은'e'를 파일에 인쇄해서 그것이 무엇인지 알 수 있도록, 나는 내가 가까이에 있다고 생각했지만 나는 하하에서 벗어났다. : – bbesase

+1

먼저'e'를 생성해야합니다. 예외가 발생하지 않으므로 예외가 발생하지 않습니다. – chepner

+0

bbesase, 실수로 게시물을 조금 편집했습니다. – kqr