PythonÔÇÖdaki bir istisnay─▒ elle olu┼čturma


Al─▒nan cevaba git


Python'da bir istisnay─▒ nas─▒l ortaya ├ž─▒karabilirim ki daha sonra bir except blok yoluyla yakalanabilir ?


2042









Cevap say─▒s─▒n─▒ say: 7






Python'da bir istisnay─▒ elle nas─▒l f─▒rlat─▒p / kald─▒rabilirim?

Sorununuza anlamsal olarak uyan en ├Âzel ─░stisna kurucusunu kullan─▒n .

Mesaj─▒n─▒za ├Âzel olun, ├Ârne─čin:

 raise ValueError('A very specific bad thing happened.')
 

Genel istisnalar kald─▒rma

Genel bir ─░stisna olu┼čturmaktan ka├ž─▒n─▒n. Onu yakalamak i├žin, onu s─▒n─▒fland─▒ran di─čer t├╝m ├Âzel istisnalar─▒ yakalamak zorundas─▒n─▒z.

Problem 1: Hatalar─▒ gizleme

 raise Exception('I know Python!') # Don't! If you catch, likely to hide bugs.
 

├ľrne─čin:

 def demo_bad_catch():
    try:
        raise ValueError('Represents a hidden bug, do not catch this')
        raise Exception('This is the exception you expect to handle')
    except Exception as error:
        print('Caught this error: ' + repr(error))

>>> demo_bad_catch()
Caught this error: ValueError('Represents a hidden bug, do not catch this',)
 

Problem 2: Yakalanmayacak

ve daha belirli yakalamalar genel istisnay─▒ yakalamaz:

 def demo_no_catch():
    try:
        raise Exception('general exceptions not caught by specific handling')
    except ValueError as e:
        print('we will not catch exception: Exception')


>>> demo_no_catch()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 3, in demo_no_catch
Exception: general exceptions not caught by specific handling
 

En ─░yi Uygulamalar: raise deyim

Bunun yerine, sorununuza anlamsal olarak uyan en ├Âzel ─░stisna yap─▒c─▒s─▒n─▒ kullan─▒n .

 raise ValueError('A very specific bad thing happened')
 

Ayr─▒ca, kurucuya iletilebilecek rastgele say─▒da arg├╝man da sa─člar:

 raise ValueError('A very specific bad thing happened', 'foo', 'bar', 'baz') 
 

Bu arg├╝manlara args ─░stisna nesnesindeki ├Âznitelikten eri┼čilir . ├ľrne─čin:

 try:
    some_code_that_may_raise_our_value_error()
except ValueError as err:
    print(err.args)
 

bask─▒lar

 ('message', 'foo', 'bar', 'baz')    
 

Python 2.5'te, message kullan─▒c─▒lar─▒ ─░stisnalar'─▒ alt s─▒n─▒fa koymaya ve kullanmay─▒ b─▒rakmaya te┼čvik etmek lehine BaseException'a ger├žek bir ├Âzellik eklendi args , ancak arg├╝manlar─▒n ba┼člang─▒├žtan kald─▒r─▒lmas─▒ ve tan─▒t─▒lmas─▒ message geri ├žekildi .

En ─░yi Uygulamalar: except f─▒kra

Bir istisna c├╝mlesi i├žerisindeyken, ├Ârne─čin, belirli bir hata t├╝r├╝n├╝n ger├žekle┼čti─čini g├╝nl├╝─če kaydetmek ve ard─▒ndan yeniden y├╝kseltmek isteyebilirsiniz. Y─▒─č─▒n izini korurken bunu yapman─▒n en iyi yolu, ├ž─▒plak bir y├╝kseltme ifadesi kullanmakt─▒r. ├ľrne─čin:

 logger = logging.getLogger(__name__)

try:
    do_something_in_app_that_breaks_easily()
except AppError as error:
    logger.error(error)
    raise                 # just this!
    # raise AppError      # Don't do this, you'll lose the stack trace!
 

Hatalar─▒n─▒ de─či┼čtirmeyin ... ama ─▒srar ederseniz.

Y─▒─č─▒nlamay─▒ (ve hata de─čerini) ile koruyabilirsiniz sys.exc_info() , ancak bu ├žok daha fazla hataya a├ž─▒kt─▒r ve Python 2 ile 3 aras─▒nda uyumluluk sorunlar─▒ var , raise yeniden y├╝kseltmek i├žin ├ž─▒plak kullanmay─▒ tercih edin .

A├ž─▒klamak i├žin - sys.exc_info() t├╝r, de─čer ve geri izlemeyi d├Ând├╝r├╝r.

 type, value, traceback = sys.exc_info()
 

Bu Python 2'deki s├Âzdizimidir - bunun Python 3 ile uyumlu olmad─▒─č─▒n─▒ unutmay─▒n:

     raise AppError, error, sys.exc_info()[2] # avoid this.
    # Equivalently, as error *is* the second object:
    raise sys.exc_info()[0], sys.exc_info()[1], sys.exc_info()[2]
 

─░sterseniz, yeni y├╝kseltme i┼čleminizde olanlar─▒ de─či┼čtirebilirsiniz - ├Ârne─čin, ├Ârne─čin yeni arg├╝manlar─▒ ayarlamak:

 def error():
    raise ValueError('oops!')

def catch_error_modify_message():
    try:
        error()
    except ValueError:
        error_type, error_instance, traceback = sys.exc_info()
        error_instance.args = (error_instance.args[0] + ' <modification>',)
        raise error_type, error_instance, traceback
 

Ve biz t├╝m arg├╝manlar─▒ de─či┼čtirirken t├╝m izleri koruduk. Bunun en iyi uygulama olmad─▒─č─▒n─▒ ve Python 3'te ge├žersiz bir s├Âzdizimi oldu─čunu unutmay─▒n (uyumlulukta ├žal─▒┼čmay─▒ zorla┼čt─▒r─▒r).

 >>> catch_error_modify_message()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 3, in catch_error_modify_message
  File "<stdin>", line 2, in error
ValueError: oops! <modification>
 

In Python 3 :

     raise error.with_traceback(sys.exc_info()[2])
 

Yine: geri izleme i┼člemlerini manuel olarak yapmaktan ka├ž─▒n─▒n. Daha az verimli ve daha fazla hataya a├ž─▒k. Ve e─čer i┼č par├žac─▒─č─▒ kullan─▒yorsan─▒z ve sys.exc_info hatta yanl─▒┼č bir geri bildirim bile alabilirsiniz (├Âzellikle kontrol ak─▒┼č─▒ i├žin istisna y├Ânetimi kullan─▒yorsan─▒z - ki bu ki┼čisel olarak ka├ž─▒nmaya meyillidir).

Python 3, ─░stisna zincirleme

Python 3'te geri izleme durumlar─▒n─▒ koruyan ─░stisnalar zincirini olu┼čturabilirsiniz:

     raise RuntimeError('specific message') from error
 

Fark─▒nda olmak:

  • bu , olu┼čturulan hata t├╝r├╝n├╝n de─či┼čtirilmesine izin verir ve
  • bu Python 2 ile uyumlu de─čildir .

Kald─▒r─▒lan Y├Ântemler:

Bunlar kolayca gizlenebilir ve hatta ├╝retim koduna girebilir. Bir istisna olu┼čturmak istiyorsunuz, ve bunlar─▒ yapmak bir istisna yaratacakt─▒r, ancak ama├žlanan─▒ de─čil!

Python 2ÔÇÖde ge├žerlidir, ancak Python 3ÔÇÖte ge├žerli de─čildir :

 raise ValueError, 'message' # Don't do this, it's deprecated!
 

Yaln─▒zca Python'un (2.4 ve daha d├╝┼č├╝k) daha eski s├╝r├╝mlerinde ge├žerlidir , hala dize y├╝kselten insanlar─▒ g├Ârebilirsiniz:

 raise 'message' # really really wrong. don't do this.
 

T├╝m modern s├╝r├╝mlerde, bu asl─▒nda bir TypeError'─▒ y├╝kseltir, ├ž├╝nk├╝ bir BaseException t├╝r├╝ y├╝kseltmezsiniz. Do─čru istisnay─▒ kontrol etmiyorsan─▒z ve sorunun fark─▒nda olan bir g├Âzden ge├žiriciniz yoksa, ├╝retime girebilir.

├ľrnek Kullan─▒m

T├╝keticilerimi yanl─▒┼č kullan─▒yorlarsa, t├╝keticileri API'm konusunda uyarmak i├žin ─░stisnalar yay─▒nlar─▒m:

 def api_func(foo):
    '''foo should be either 'baz' or 'bar'. returns something very useful.'''
    if foo not in _ALLOWED_ARGS:
        raise ValueError('{foo} wrong, use "baz" or "bar"'.format(foo=repr(foo)))
 

Apropos yaparken kendi hata t├╝rlerinizi yarat─▒n

"─░steyerek bir hata yapmak istiyorum ki d─▒┼čar─▒n─▒n i├žine girsin"

Uygulaman─▒zla ilgili belirli bir sorunun oldu─čunu belirtmek istiyorsan─▒z, istisna hiyerar┼čisinde uygun noktay─▒ alt s─▒n─▒fland─▒rman─▒z yeterlidir: Kendi hata t├╝rlerinizi olu┼čturabilirsiniz:

 class MyAppLookupError(LookupError):
    '''raise this when there's a lookup error for my app'''
 

ve kullan─▒m:

 if important_key not in resource_dict and not ok_to_be_missing:
    raise MyAppLookupError('resource is missing, and that is not ok.')
 

2627







BU YAPMAYIN . ├ç─▒plak yeti┼čtirmek Exception kesinlikle yap─▒lacak do─čru ┼čey de─čildir ; bkz Aaron Hall'un m├╝kemmel bir cevap yerine.

Bundan daha fazla pitonik olamaz:

 raise Exception("I know python!")
 

Daha fazla bilgi edinmek isterseniz, python i├žin raise deyimi belgelerine bak─▒n .


528







Python3'te istisnalar─▒ d─▒┼člamak i├žin 4 farkl─▒ s├Âzdizimi vard─▒r:

 1. raise exception 
2. raise exception (args) 
3. raise
4. raise exception (args) from original_exception
 

1. istisna y├╝kseltme - 2. istisna y├╝kseltme

Bir raise exception (args) istisna olu┼čturmak i├žin kullan─▒rsan─▒z args , istisna nesnesini yazd─▒rd─▒─č─▒n─▒zda a┼ča─č─▒daki ├Ârnekte g├Âsterildi─či gibi bas─▒lacakt─▒r.

   #raise exception (args)
    try:
        raise ValueError("I have raised an Exception")
    except ValueError as exp:
        print ("Error", exp)     # Output -> Error I have raised an Exception 



  #raise execption 
    try:
        raise ValueError
    except ValueError as exp:
        print ("Error", exp)     # Output -> Error 
 

3.raise

raise Herhangi bir arg├╝man olmadan yap─▒lan a├ž─▒klama son istisnay─▒ yeniden g├╝ndeme getirir. Bu, istisnay─▒ yakalad─▒ktan sonra baz─▒ eylemler ger├žekle┼čtirmeniz gerekiyorsa ve ard─▒ndan yeniden y├╝kseltmek istiyorsan─▒z kullan─▒┼čl─▒d─▒r. Ancak, daha ├Ânce bir istisna olmad─▒ysa, raise ifade ─░stisna'y─▒ y├╝kseltir TypeError .

 def somefunction():
    print("some cleaning")

a=10
b=0 
result=None

try:
    result=a/b
    print(result)

except Exception:            #Output ->
    somefunction()           #some cleaning
    raise                    #Traceback (most recent call last):
                             #File "python", line 8, in <module>
                             #ZeroDivisionError: division by zero
 

4. original_exception i├žinden istisna (args) y├╝kseltme

Bu ifade, a┼ča─č─▒daki ├Ârnekte g├Âsterildi─či gibi, ba┼čka bir istisnaya yan─▒t olarak ortaya at─▒lan bir istisnan─▒n orijinal istisnan─▒n ayr─▒nt─▒lar─▒n─▒ i├žerebilece─či bir istisna zinciri olu┼čturmak i├žin kullan─▒l─▒r.

 class MyCustomException(Exception):
pass

a=10
b=0 
reuslt=None
try:
    try:
        result=a/b

    except ZeroDivisionError as exp:
        print("ZeroDivisionError -- ",exp)
        raise MyCustomException("Zero Division ") from exp

except MyCustomException as exp:
        print("MyException",exp)
        print(exp.__cause__)
 

Çıktı:

 ZeroDivisionError --  division by zero
MyException Zero Division 
division by zero
 

42







Baz─▒ beklenmedik ko┼čullara yan─▒t olarak bir istisna atman─▒z gereken ve asla yakalama niyetinde olmad─▒─č─▒n─▒z, ancak basit├že oradan hata ay─▒klaman─▒z─▒ sa─člamak i├žin h─▒zl─▒ca ba┼čar─▒s─▒z olaca─č─▒n─▒z genel durum i├žin - en mant─▒kl─▒ olan─▒ AssertionError :

 if 0 < distance <= RADIUS:
    #Do something.
elif RADIUS < distance:
    #Do something.
else:
    raise AssertionError("Unexpected value of 'distance'!", distance)
 

33







├ľnce mevcut cevaplar─▒ okuyun, bu sadece bir zeyilname.

Ba─č─▒ms─▒z de─či┼čkenleri arg├╝manlar ile veya arg├╝manlar olmadan dile getirebilece─činizi unutmay─▒n.

├ľrnek:

 raise SystemExit
 

programdan ├ž─▒kar, ancak ne oldu─čunu bilmek isteyebilirsiniz. Yani bunu kullanabilirsiniz.

 raise SystemExit("program exited")
 

Bu, program kapat─▒lmadan ├Ânce stderr'e "program ├ž─▒k─▒ld─▒" yazar.


11







─░stisnalar─▒ atman─▒n ba┼čka bir yolu da assert . Bir ko┼čulun yerine getirilip getirilmedi─čini yerine getirmedi─čini do─črulamak i├žin assert kullanabilirsiniz AssertionError . Daha fazla ayr─▒nt─▒ i├žin buraya bir g├Âz at─▒n .

 def avg(marks):
    assert len(marks) != 0,"List is empty."
    return sum(marks)/len(marks)

mark2 = [55,88,78,90,79]
print("Average of mark2:",avg(mark2))

mark1 = []
print("Average of mark1:",avg(mark1))
 

1







Sadece not etmek gerekirse: Genel istisnalar─▒ ele almak istedi─činiz zamanlar olabilir. Bir s├╝r├╝ dosyay─▒ i┼čliyor ve hatalar─▒n─▒z─▒ g├╝nl├╝─če kaydediyorsan─▒z, bir dosya i├žin ortaya ├ž─▒kan herhangi bir hatay─▒ yakalamak, g├╝nl├╝─če kaydetmek ve kalan dosyalar─▒n i┼členmesine devam etmek isteyebilirsiniz. Bu durumda, bir

 try:
    foo() 
except Exception as e:
    print(str(e)) # Print out handled error
 

Bunu yapmak i├žin iyi bir yol engelleyin. Yine de raise belirli istisnalar isteyeceksiniz, bu y├╝zden ne anlama geldiklerini bileceksiniz.


1



─░lgili yay─▒nlar


Python i┼člevinin bir istisna att─▒─č─▒n─▒ nas─▒l test edersiniz?

Python'da bir istisna nas─▒l yazd─▒r─▒l─▒r?

Bir istisna C# ile yeniden atman─▒n do─čru yolu nedir? [├žift]

Ama├ž-c / kakaoda istisna atmak

Java'ya istisna atmadan y─▒─č─▒n izini b─▒rakman─▒n bir yolu var m─▒?

Rails'teki bir istisnay─▒ nas─▒l y├╝kseltirim, b├Âylece di─čer Rails istisnalar─▒ gibi davran─▒r?

C istisnas─▒ nas─▒l at─▒l─▒r?

Yuvalanm─▒┼č deneme / bloklar hari├ž bir istisna nas─▒l yeniden olu┼čturulur?

Atar bildirgesini eklemeden istisna atman─▒n bir yolu var m─▒?

Java'da bir istisna atmadan, bir try / catch blo─čundan nas─▒l k─▒rabilirim

Etiketle ilgili di─čer sorular [python]


Alt mod├╝ller dahil olmak ├╝zere "git klon" nas─▒l yap─▒l─▒r?

Tablo Adland─▒rma ─░kilemi: Tekil ve ├ço─čul ─░simler [kapal─▒]

Boolean de─či┼čkenlerini bir kabuk beti─činde nas─▒l ilan edebilir ve kullanabilirim?

UITextField metin de─či┼čikli─či olay─▒

ÔÇťSTLÔÇŁ ve ÔÇťC ++ Standard LibraryÔÇŁ aras─▒ndaki fark nedir?

.NET'te hangi d├Âng├╝ daha h─▒zl─▒ ├žal─▒┼č─▒r, 'for' veya 'foreach'?

Bir dosyan─▒n python i├žinde bir dizin veya normal dosya olup olmad─▒─č─▒n─▒ kontrol etmek nas─▒l? [├žift]

'Exit' yazmadan ekrandan nas─▒l ├ž─▒kar─▒m?

Microsoft SQL Server'a Giri┼č Hatas─▒: 18456

twitter bootstrap typeahead ajax ├Ârne─či