2013-08-11 44 views
6

Tôi đang gặp một số vấn đề với câu lệnh try và except, tôi có một tiện ích con nhập dữ liệu vào chuỗi nhưng tôi có mã chuyển đổi thành số nguyên sau đó, vấn đề là nếu người sử dụng đầu vào một cái gì đó như văn bản nó ném một lỗi như thế này:biến cục bộ được tham chiếu trước khi gán với câu lệnh try và except

Exception in Tkinter callback 
Traceback (most recent call last): 
    File "/usr/lib/python3.2/tkinter/__init__.py", line 1402, in __call__ 
    return self.func(*args) 
    File "/home/ppppwn3d/workspace/Python/JailBreakBob/JailBreakBob.py", line 157, in buttonclick_gamescreen 
    entryx = int(e1.get()) 
ValueError: invalid literal for int() with base 10: 'abc' 

Vì vậy, tôi muốn che giấu lỗi với thử và ngoại trừ báo cáo nhưng bây giờ tôi nhận được một thông báo lỗi.

Đây là hình thức của mã.

while pressed == 8 : 
     try: 
      entryx = int(e1.get()) 
      entryy = int(e2.get()) 
     except ValueError: 
      print("text") 

     answerx = answerlistx[randomimage] 
     answery = answerlisty[randomimage] 

     if entryx == answerx and entryy == answery 
      canvas.delete(images) 
      randomimage = random.randrange(0,49+1) 
      scorecounter = scorecounter + 1 
      game = PhotoImage(file=imagelist[randomimage]) 
      images = canvas.create_image(30, 65, image = game, anchor = NW) 
      e1.delete(0, END) 
      e2.delete(0, END) 
      pressed = '' 
     if entryx > 10 or entryx < -10 or entryy > 10 or entryy < -10 : 
      wrong = canvas.create_image(30, 65, image = outside, anchor = NW) 
      e1.delete(0, END) 
      e2.delete(0, END) 
      pressed = '' 
     else: 
      wrong = canvas.create_image(30, 65, image = incorrect, anchor = NW) 
      e1.delete(0, END) 
      e2.delete(0, END) 
      pressed = '' 

Thông báo lỗi mới:

text 
Exception in Tkinter callback 
Traceback (most recent call last): 
    File "/usr/lib/python3.2/tkinter/__init__.py", line 1402, in __call__ 
    return self.func(*args) 
    File "/home/ppppwn3d/workspace/Python/JailBreakBob/JailBreakBob.py", line 165, in buttonclick_gamescreen 
    if entryx == answerx and entryy == answery: 
UnboundLocalError: local variable 'entryx' referenced before assignment 

tôi không thể tìm ra lý do tại sao điều này xảy ra và làm thế nào để sửa chữa nó vì vậy bất kỳ trợ giúp sẽ được đánh giá cao.

Xin cảm ơn trước.

Trả lời

5

Nếu có ngoại lệ trong khối try/except của bạn, sẽ không có entryxentryy biến được xác định trong phạm vi.

Bạn phải ném và lỗi và thoát khỏi chương trình hoặc chỉ định entryxentryy giá trị mặc định trong khối except.

Ngoài ra, bạn có thể tạo vòng lặp while cho đến khi người dùng nhập số nguyên như được đề xuất here.

0

bạn có thể thấy thông báo 'văn bản'.
vì vậy, ngoại lệ được nâng lên và entryx không được khởi tạo.
đó là lý do tại sao bạn đã có:

local variable 'entryx' referenced before assignment 
4

Để thêm vào @alecxe's answer, tôi thà sửa đổi chương trình như sau:

entryx, entryy = 0, 0 
    try: 
     entryx = int(e1.get()) 
     entryy = int(e2.get()) 
    except ValueError: 
     print("text") 

Về cơ bản, những gì lỗi nghĩa là trong trường hợp có lỗi , entryx, entryy không bao giờ được chỉ định bất kỳ điều gì, nhưng vẫn được tham chiếu sau trong séc if..else.

Tốt nhất nên có giá trị mặc định cho các biến bên ngoài khối try..except.

1

Tôi sẽ khởi tạo answerx, trả lời bằng Không trước khi thử chặn bắt đầu.