2010-06-01 42 views
36

Tôi đang viết một ứng dụng nhỏ và tôi cần phải thoát khỏi chương trình nhiều lần.Cách thoát chương trình: sys.stderr.write() hoặc in

Tôi có nên sử dụng:

sys.stderr.write('Ok quitting')
sys.exit(1)

Hoặc nên tôi chỉ làm một:

print 'Error!'
sys.exit(1)

Đó là tốt hơn và tại sao? Lưu ý rằng tôi cần phải làm điều này rất nhiều. Chương trình hoàn toàn nên thoát.

Trả lời

70
sys.exit('Error!') 

Lưu ý từ the docs:

Nếu một loại đối tượng được thông qua, Không tương đương với đi qua không, và bất kỳ đối tượng khác được in đến sys.stderr và dẫn đến mã thoát trong số 1. Đặc biệt, sys.exit ("một số thông báo lỗi ") là một cách nhanh chóng để thoát khỏi một chương trình khi có lỗi xảy ra.

6

Nếu đó là thông báo lỗi, thông thường sẽ chuyển đến stderr - nhưng việc này có cần thiết hay không tùy thuộc vào trường hợp sử dụng của bạn. Nếu bạn mong đợi người dùng chuyển hướng stdin, stderrstdout, ví dụ: khi chạy chương trình của bạn từ một công cụ khác, thì bạn nên đảm bảo rằng thông tin trạng thái và thông báo lỗi được tách riêng sạch.

Nếu chỉ bạn sử dụng chương trình, có thể bạn không cần phải bận tâm. Trong trường hợp đó, bạn cũng có thể chỉ cần tăng ngoại lệ và chương trình sẽ tự chấm dứt.

Bằng cách này, bạn có thể làm

print >>sys.stderr, "fatal error"  # Python 2.x 
print("fatal error", file=sys.stderr) # Python 3.x 
+0

Cảm ơn bạn đã trả lời. – user225312

12

Chúng là hai cách hiển thị thông điệp khác nhau.

print thường đi tới sys.stdout và bạn biết nơi sys.stderr đang diễn ra. Cần biết sự khác biệt giữa stdin, stdout, and stderr.

stdout nên được sử dụng cho đầu ra chương trình bình thường, trong khi stderr chỉ được dành riêng cho thông báo lỗi (thực thi chương trình bất thường). Có các tiện ích để tách các luồng này, cho phép người dùng mã của bạn phân biệt giữa đầu ra và lỗi bình thường.

print có thể in trên bất kỳ đối tượng tập tin giống như, bao gồm sys.stderr:

print >> sys.stderr, 'My error message' 

Những lợi thế của việc sử dụng sys.stderr lỗi thay vì sys.stdout là:

  1. Nếu người dùng chuyển hướng stdout để một tệp, họ vẫn thấy lỗi trên màn hình.
  2. Không bị chặn, vì vậy nếu sys.stderr được chuyển hướng đến tệp nhật ký, sẽ ít có khả năng chương trình bị lỗi trước khi lỗi được ghi lại.

Nó đáng chú ý là có một cách thứ ba, bạn có thể cung cấp một thông điệp kết thúc:

sys.exit('My error message') 

này sẽ gửi một thông điệp tới stderr và thoát.

Các vấn đề liên quan