AMcoder - javascript, python, java, html, php, sql

Բացառությունների պահպանում Tkinter-ում Python-ի միջոցով

Ես մշակել եմ Python-ի մի քանի ծրագրեր մյուսների համար, որոնք օգտագործում են Tkinter-ը՝ օգտատերից մուտքագրում ստանալու համար: Պարզ և օգտագործողի համար հարմար պահելու համար հրամանի տողը կամ python կոնսոլը երբեք չեն բացվում (այսինքն՝ օգտագործվում են .pyw ֆայլեր), այնպես որ ես օգտագործում եմ գրանցման գրադարանը՝ սխալի տեքստը ֆայլում գրելու համար, երբ բացառություն է տեղի ունենում. Այնուամենայնիվ, ես դժվարանում եմ ստանալ այն, որպեսզի իրականում բռնել բացառությունները: Օրինակ:

Մենք գրում ենք ֆունկցիա, որը կառաջացնի սխալ.

def cause_an_error():
    a = 3/0

Այժմ մենք փորձում ենք նորմալ գրանցել սխալը.

import logging
logging.basicConfig(filename='errors.log', level=logging.ERROR)

try:
    cause_an_error()
except:
    logging.exception('simple-exception')

Ինչպես և սպասվում էր, ծրագիրը սխալվում է, և գրանցումը գրում է սխալը errors.log-ում: Վահանակում ոչինչ չի հայտնվում: Այնուամենայնիվ, կա այլ արդյունք, երբ մենք իրականացնում ենք Tkinter ինտերֆեյս, ինչպես այսպես.

import logging
import Tkinter
logging.basicConfig(filename='errors.log', level=logging.ERROR)

try:
    root = Tkinter.Tk()
    Tkinter.Button(root, text='Test', command=cause_an_error).pack()
    root.mainloop()
except:
    logging.exception('simple-exception')

Այս դեպքում Tkinter պատուհանում կոճակը սեղմելը սխալ է առաջացնում: Այնուամենայնիվ, այս անգամ ֆայլում ոչինչ գրված չէ, և վահանակում հայտնվում է հետևյալ սխալը.

Exception in Tkinter callback
Traceback (most recent call last):
  File "C:\Python27\lib\lib-tk\Tkinter.py", line 1536, in __call__
    return self.func(*args)
  File "C:/Users/samk/Documents/GitHub/sandbox/sandbox2.pyw", line 8, in cause_an_error
    a = 3/0
ZeroDivisionError: integer division or modulo by zero

Այս սխալը բռնելու և գրանցելու այլ եղանակ կա՞:

19.07.2016

  • Tkinter-ն աշխատում է իր սեփական շղթայի վրա, և այն ամենը, ինչ գալիս է root.mainloopից հետո, կատարվում է միայն պատուհանը փակելուց հետո: Նկատի ունեցեք նաև, որ cause_an_error-ը կատարվում է միայն կոճակը սեղմելիս, բայց սկզբում գործարկվում է root.mainloopը: Ինչ է տեղի ունենում, հավանաբար, այն է, որ բացառությունը չի բռնվում, քանի որ այն նետվում է այլ միջավայրում... Հուսով եմ, որ ինչ-որ մեկը կգա ավելի մանրամասն և տեխնիկական պատասխանով: 19.07.2016
  • Հետաքրքիր է. Այժմ, երբ դուք նշում եք դա, «բարձրացնել» հրամանը նույնպես չի կարող վերբերել սխալը, ուստի այն հաստատ կարծես թե նետված է այլ միջավայրում: Կա՞ որևէ միջոց, որով ես կարող եմ փոփոխել Tkinter-ի սխալների մշակումը, որպեսզի ներմուծեմ այն ​​մուտքագրելուց հետո: 19.07.2016
  • Դուք կարող եք ուղղակիորեն բռնել բացառությունը ֆունկցիայի մեջ... 19.07.2016
  • Այո, դա միանշանակ ճիշտ է: Հուսով եմ, որ ավելի էլեգանտ լուծում կա, քան յուրաքանչյուր գործառույթը փորձելու/բացառությամբ հայտարարությունների մեջ ներառելը, սակայն, հատկապես շատ ավելի բարդ ծրագրում, որն ունի բազմաթիվ գործառույթներ: 19.07.2016

Պատասխանները:


1

Այն այնքան էլ լավ փաստագրված չէ, բայց tkinter-ը կոչ է անում մեթոդ բացառությունների համար, որոնք տեղի են ունենում հետ կանչի արդյունքում: Դուք կարող եք գրել ձեր սեփական մեթոդը՝ անել այն, ինչ ցանկանում եք՝ արմատային պատուհանում սահմանելով report_callback_exception հատկանիշը:

Օրինակ:

import tkinter as tk

def handle_exception(exception, value, traceback):
    print("Caught exception:", exception)

def raise_error():
    raise Exception("Sad trombone!")

root = tk.Tk()
# setup custom exception handling
root.report_callback_exception=handle_exception

# create button that causes exception
b = tk.Button(root, text="Generate Exception", command=raise_error)
b.pack(padx=20, pady=20)

root.mainloop()

Հղման համար:

20.07.2016
  • Կատարյալ, շնորհակալություն: :) Կա՞ որևէ տարբերակ առբերելու տողի համարը կամ բացառությունը ստացած ֆունկցիան: 20.07.2016
  • @SamKrygsheld. նայեք traceback փաստարկին: 20.07.2016
  • Ահ, այո, շնորհակալություն: Յուրաքանչյուրի համար, ով կարող է դա տեսնել ապագայում, ես ենթադրել էի, որ փոխանցվող հետագծումը տող է, բայց իրականում դա հետագծային օբյեկտ է: Traceback.tb_lineno-ի օգտագործումը թույլ կտա մուտք գործել գծի համարը: 20.07.2016
  • Նոր նյութեր

    Օգտագործելով Fetch Vs Axios.Js-ը՝ HTTP հարցումներ կատարելու համար
    JavaScript-ը կարող է ցանցային հարցումներ ուղարկել սերվեր և բեռնել նոր տեղեկատվություն, երբ դա անհրաժեշտ լինի: Օրինակ, մենք կարող ենք օգտագործել ցանցային հարցումը պատվեր ներկայացնելու,..

    Տիրապետել հանգստության արվեստին. մշակողի ուղեցույց՝ ճնշման տակ ծաղկելու համար
    Տիրապետել հանգստության արվեստին. մշակողի ուղեցույց՝ ճնշման տակ ծաղկելու համար Ինչպե՞ս հանգստացնել ձեր միտքը և աշխատեցնել ձեր պրոցեսորը: Ինչպես մնալ հանգիստ և զարգանալ ճնշման տակ...

    Մեքենայի ուսուցում բանկային և ֆինանսների ոլորտում
    Բարդ, խելացի անվտանգության համակարգերը և հաճախորդների սպասարկման պարզեցված ծառայությունները բիզնեսի հաջողության բանալին են: Ֆինանսական հաստատությունները, մասնավորապես, պետք է առաջ մնան կորի..

    Ես AI-ին հարցրի կյանքի իմաստը, այն ինչ ասում էր, ցնցող էր:
    Այն պահից ի վեր, երբ ես իմացա Արհեստական ​​ինտելեկտի մասին, ես հիացած էի այն բանով, թե ինչպես է այն կարողանում հասկանալ մարդկային նորմալ տեքստը, և այն կարող է առաջացնել իր սեփական արձագանքը դրա..

    Ինչպես սովորել կոդավորումը Python-ում վագրի պես:
    Սովորելու համար ծրագրավորման նոր լեզու ընտրելը բարդ է: Անկախ նրանից, թե դուք սկսնակ եք, թե առաջադեմ, դա օգնում է իմանալ, թե ինչ թեմաներ պետք է սովորել: Ծրագրավորման լեզվի հիմունքները, դրա..

    C++-ի օրական բիթ(ե) | Ամենաերկար պալինդրոմային ենթաշարը
    C++ #198-ի ամենօրյա բիթ(ե), Ընդհանուր հարցազրույցի խնդիր. Ամենաերկար պալինդրոմային ենթատող: Այսօր մենք կանդրադառնանք հարցազրույցի ընդհանուր խնդրին. Ամենաերկար palindromic substring...

    Kydavra ICAReducer՝ ձեր տվյալների ծավալայինությունը նվազեցնելու համար
    Ի՞նչ է ICAReducer-ը: ICAReducer-ն աշխատում է հետևյալ կերպ. այն նվազեցնում է նրանց միջև բարձր փոխկապակցված հատկանիշները մինչև մեկ սյունակ: Բավականին նման է PCAreducer-ին, չնայած այն..