Tôi có một số chức năng phân tích cú pháp dữ liệu từ các tệp, thường trả về một danh sách các kết quả.Tôi muốn trả về một giá trị VÀ nêu ra một ngoại lệ, điều này có nghĩa là tôi đang làm điều gì sai?
Nếu tôi gặp phải một đường tinh ranh trong tệp, tôi muốn người lính và xử lý các dòng hợp lệ và trả lại chúng. Nhưng tôi cũng muốn báo cáo lỗi cho chức năng gọi. Lý do tôi muốn báo cáo nó là để các chức năng gọi điện thoại có thể thông báo cho người dùng rằng các tập tin cần xem xét. Tôi không muốn bắt đầu làm những thứ GUI trong chức năng phân tích cú pháp, vì điều đó dường như là một sự vi phạm lớn về việc phân tách các mối quan tâm. Chức năng phân tích cú pháp không có quyền truy cập vào bảng điều khiển Tôi vẫn đang viết thông báo lỗi.
Điều này khiến tôi muốn trả lại dữ liệu thành công, nhưng cũng tăng ngoại lệ do lỗi, điều này rõ ràng là tôi không thể làm được.
xem xét mã này:
try:
parseResult = parse(myFile)
except MyErrorClass, e:
HandleErrorsSomehow(str(e))
def parse(file): #file is a list of lines from an actual file
err = False
result = []
for lines in file:
processedLine = Process(line)
if not processedLine:
err = True
else
result.append(processedLine)
return result
if err:
raise MyErrorClass("Something went wrong")
Rõ ràng là ba dòng cuối cùng làm cho không có ý nghĩa, nhưng tôi không thể tìm ra một cách tốt đẹp để làm điều này. Tôi đoán tôi có thể làm return (err, result)
, và gọi nó là như
parseErr, parseResult = parse(file)
if parseErr:
HandleErrorsSomehow()
Nhưng trở về mã lỗi dường như đủ un-pythonic, hãy để một mình trở về tuples của mã lỗi và các giá trị kết quả thực tế.
Thực tế là tôi cảm thấy như tôi muốn làm điều gì đó kỳ lạ trong một ứng dụng không thực sự phức tạp đến mức khủng khiếp, khiến tôi nghĩ rằng có lẽ tôi đang làm điều gì đó sai. Có một giải pháp tốt hơn cho vấn đề này? Hoặc có cách nào để tôi có thể sử dụng finally
để trả lại giá trị và tăng ngoại lệ cùng một lúc không?
Trong trường hợp này, tôi có lẽ sẽ trả về một tuple 'processedData, errorInformation', với' errorInformation' là một chuỗi rỗng nếu không có lỗi xảy ra. Một tùy chọn khác là sử dụng chức năng gọi lại, được gọi với một số thông tin lỗi nếu xảy ra lỗi - nếu người gọi không quan tâm, nó có thể chuyển 'Không' làm cuộc gọi lại. –