Chỉ cần tự hỏi nếu điều này được coi là sử dụng rõ ràng về goto trong C#:Đây có phải là cách sử dụng rõ ràng của goto không?
IDatabase database = null;
LoadDatabase:
try
{
database = databaseLoader.LoadDatabase();
}
catch(DatabaseLoaderException e)
{
var connector = _userInteractor.GetDatabaseConnector();
if(connector == null)
throw new ConfigException("Could not load the database specified in your config file.");
databaseLoader = DatabaseLoaderFacade.GetDatabaseLoader(connector);
goto LoadDatabase;
}
tôi cảm thấy như thế này là ok, vì đoạn là nhỏ và nên có ý nghĩa. Có cách nào khác mọi người thường phục hồi từ các lỗi như thế này khi bạn muốn thử lại hoạt động sau khi xử lý ngoại lệ?
Chỉnh sửa: Tốc độ nhanh. Để trả lời một số câu hỏi và làm rõ mọi thứ một chút - đây là một phần của quá trình chủ yếu chuyển đổi từ một loại dự án khác. Cuộc gọi _userInteractor.GetDatabaseConnector() là phần sẽ xác định xem người dùng có muốn thử lại (có thể với một cơ sở dữ liệu khác với cơ sở dữ liệu mà họ đang tải). Nếu nó trả về null, thì không có kết nối cơ sở dữ liệu mới nào được chỉ định và thao tác sẽ thất bại hoàn toàn.
Tôi không biết tại sao tôi không nghĩ đến việc sử dụng vòng lặp while. Nó phải nhận được quá gần đến 5 giờ chiều.
Chỉnh sửa 2: Tôi đã xem phương thức LoadDatabase() và nó sẽ ném một DatabaseLoaderException
nếu không thành công. Tôi đã cập nhật mã ở trên để bắt ngoại lệ đó thay vì Ngoại lệ.
Sửa 3: Sự đồng thuận chung dường như là
- Sử dụng goto ở đây là không cần thiết - một vòng lặp while sẽ làm tốt.
- Sử dụng ngoại lệ như thế này không phải là ý tưởng hay - tôi không chắc chắn nên thay thế nó bằng cách nào.
không cần phải bỏ phiếu xuống một câu hỏi hợp pháp vì nó có goto từ trong đó. –
Để OP: Sử dụng Goto không cần phải "rõ ràng". Nó cần phải là "đúng". Cách sử dụng của bạn rõ ràng, nhưng rất không chính xác. Bạn có câu trả lời tuyệt vời ở đây, chú ý đến họ :-) –
Nhưng đó không phải là nam giới mà câu hỏi nên được giảm bớt. –