Mã của chúng tôi bắt được ngoại lệ chung ở mọi nơi.Làm thế nào để sử dụng lại cấu trúc của Ngoại lệ chung?
Thông thường nó ghi lỗi vào bảng nhật ký trong cơ sở dữ liệu và hiển thị MessageBox cho người dùng để nói rằng thao tác được yêu cầu không thành công. Nếu có tương tác cơ sở dữ liệu, giao dịch sẽ được khôi phục.
Tôi đã giới thiệu lớp logic kinh doanh và lớp truy cập dữ liệu để làm sáng tỏ một số logic. Trong lớp truy cập dữ liệu, tôi đã chọn không để bắt bất cứ điều gì và tôi cũng ném ArgumentNullExceptions và ArgumentOutOfRangeExceptions để thông điệp được truyền lên ngăn xếp không đi thẳng từ cơ sở dữ liệu.
Trong lớp logic nghiệp vụ, tôi thử bắt. Trong giao dịch tôi quay lại giao dịch, hãy thực hiện quá trình ghi nhật ký và truy cập lại.
Trong lớp bản trình bày, có một lần thử bắt hiển thị MessageBox.
Tôi hiện đang suy nghĩ về việc bắt một DataException và một ArgumentException thay vì một ngoại lệ mà tôi biết mã chỉ truy cập vào cơ sở dữ liệu.
Trường hợp mã truy cập dịch vụ web, tôi nghĩ mình sẽ tạo "WebServiceException" của riêng mình, lớp này sẽ được tạo trong lớp truy cập dữ liệu bất cứ khi nào HttpException, WebException hoặc SoapException bị ném.
Vì vậy, bây giờ, nói chung tôi sẽ bắt được 2 hoặc 3 ngoại lệ, hiện tại tôi chỉ bắt được ngoại lệ chung và tôi nghĩ điều đó có vẻ ổn với tôi. Có ai bọc ngoại lệ lên một lần nữa để mang thông điệp đến lớp trình bày không? Tôi nghĩ rằng tôi có lẽ nên thêm một thử bắt để Main() bắt ngoại lệ, cố gắng để đăng nhập nó, hiển thị một thông báo "Ứng dụng đã gặp lỗi" và thoát khỏi ứng dụng. Vì vậy, câu hỏi của tôi là, có ai nhìn thấy bất kỳ lỗ hổng nào trong kế hoạch của tôi không? Có bất kỳ trường hợp ngoại lệ rõ ràng mà tôi nên bắt hoặc làm những người này khá nhiều bao gồm nó (ngoài truy cập tập tin - Tôi nghĩ rằng chỉ có 1 nơi mà chúng tôi đọc-ghi vào một tập tin cấu hình).
Điểm tuyệt vời về cuối cùng hoặc sử dụng câu lệnh. Tôi đã làm điều đó khi giao dịch ở trong DAL, nhưng một số giao dịch của tôi vẫn còn trong BLL, vì vậy tôi đoán tôi sẽ cần để lộ một phương thức MyDatabase.Dispose(), hoặc bọc SqlCeTransaction của tôi cho câu lệnh "using" – Colin
Không chắc chắn ý bạn là gì bởi ranh giới vật lý. Không có ranh giới ở mọi phương thức gọi từ BLL đến DAL? Trong trường hợp đó, mọi cuộc gọi trong BLL sẽ có mẫu thử đăng nhập/thử. Nhưng nếu nó có nghĩa là ranh giới vật lý giữa ứng dụng và cơ sở dữ liệu, hoặc ứng dụng và dịch vụ web, hoặc ứng dụng và hệ thống tệp, thì tôi sẽ chuyển nhật ký của mình sang DAL không phải là BLL. Nhưng bạn nói rằng bạn hầu như không có bắt trong DAL hoặc BLL, và tất nhiên tôi đã chỉ cần twigged rằng bắt nên ngồi trong lớp "MyDatabase", nơi tất cả các cập nhật chèn và xóa được thực hiện. Điều đó nghe có vẻ tốt hơn nhiều. – Colin