나는 장고 앱을 개발하는 중이며 코드에서 오류와 버그를 처리하는 적절한 방법에 대한 조언을 받기를 희망합니다.Django/Python 응용 프로그램에서 적절한 오류 처리를위한 코드를 설계 하시겠습니까?
다음은 내가 가진 문제의 예입니다. 사용자가 제품을 구매했습니다.
- 먼저, 뷰가 데이터베이스에
User
객체를 생성해야합니다 구입을 처리하려면, 내보기는 여러 작업을 수행해야합니다. - 성공적이면보기에서
Order
개체를 만들어 새로 만든 사용자에게 할당해야합니다. - 성공한 경우 내 코드는
Product
개체를 만들어 새로 만든 Order에 추가해야합니다.
오류가 발생하지 않은 경우이 모든 경우에 문제가 발생하지 않지만 가끔 오류가 발생하는 것은 필연적이며 오류가 발생하지 않도록 정상적으로 오류를 처리하기를 원합니다. 예를 들어 어떤 이유로 든 Order
개체를 만들 수 없으면보기에 사용자에게 오류가 표시되고 이전에 만들어진 User
개체가 제거되어야합니다. 그리고, 그것은 명백하게 충돌하고 사용자에게 Http 500 오류를 제공하기보다는 우아한 오류 메시지를 던져야합니다.
내가 이것을 할 수있는 유일한 방법은 아래와 같이 중첩 된 try/except 절의 매우 복잡한 시리즈입니다. 그러나이 방법으로 코드를 작성하는 것은 지저분하고 시간이 오래 걸리고 일을 올바르게 수행하는 것처럼 느껴지지 않습니다. 장고와 파이썬에서 적절한 오류 처리를 설계하는 더 좋은 방법이 있어야한다는 것을 알고 있지만 그것이 무엇인지는 확실하지 않습니다.
이 상황에서 코드를 더 잘 구조화하는 방법에 대한 조언을 주시면 감사하겠습니다.
예제 코드 :이 방법에 대해
try:
# Create a new user
u = User(email='[email protected]')
u.save()
try:
# Create a new order
o = Order(user=u, name='Order name')
o.save()
try:
# Create a new product
p = Product(order=o, name='Product name')
p.save()
# If a product cannot be created, print an error message and try deleting the user and order that were previously created
except:
messages.add_message(request, messages.ERROR, 'Product could not be created')
# If deleting the order doesn't work for any reason (for example, o.save() didn't properly save the user), 'pass' to ensure my application doesn't crash
try:
o.delete()
# I use these 'except: pass' clauses to ensure that if an error occurs, my app doesn't serve a Http 500 error and instead shows the user a graceful error
except:
pass
# If deleting the user doesn't work for any reason (for example, u.save() didn't properly save the user), 'pass' to ensure my application doesn't crash
try:
u.delete()
except:
pass
# If an order cannot be created, print an error message and try deleting the user that was previously created
except:
messages.add_message(request, messages.ERROR, 'Order could not be created')
# If deleting the user doesn't work for any reason (for example, u.save() didn't properly save the user), 'pass' to ensure my application doesn't crash
try:
u.delete()
except:
pass
# If the user cannot be created, throw an error
except:
messages.add_message(request, messages.ERROR, 'User could not be created')
이것이 정확히 내가 찾고 있었던 것이다. 도와 줘서 고마워! – Sam