При разработке модульных приложений тихо ли очевидно, что нам необходимо использовать системы Fail-fast?Использование отказоустойчивого подхода при разработке модульных приложений
При создании модулей, если есть условие ошибки, которое модуль не может обработать, он должен сообщить об ошибке (например, выбросить исключение ..), не беспокоясь о том, кто ее обработает. Похоже, что это можно использовать в качестве ориентира при разработке модулей. Есть ли проблемы с этим?
Редактировать Пример:
В module.dll
public class SomeClass:ISomeInterface
{
public void CreateFile(string filename)
{
//The module have no idea who calls this. But there is something wrong
//somewhere so throw an exception early. The module writer has no control over
//how the exception is handled. So if this exception is not handled by the
//Client Application the application can potentially crash.Do he need to worry
//about that?
if(filename == null)
{
throw new ArgumentNullException("Filename is null");
}
//I think the following is bad. This code is making sure that a module
//exception wont crash the application.Is it good?
//if(filename ==null)
//{
//Logger.log("filename is null");
//return;
//}
}
}
+1, интересно. Что мне нужно знать, есть ли способ убить проблемную подсистему? Для нашего приложения у нас есть разные GUI Designers для XML-файлов в соответствии с типами. Эти графические дизайнеры создаются в виде модулей (подсистем). Если по какой-либо причине дизайнер не может работать, я хочу, чтобы этот конкретный дизайнер уклонился от приложения, оставив систему работоспособной, как ожидалось. Но вот вопрос в том, как может подсистема умереть в случае ошибки, с которой она не справится? – Jimmy
@ Jimmy: Один из подходов состоит в том, чтобы иметь мастер-свойство IsAlive (возможно, поддерживаемое переменной '_IsAlive') и иметь методы, которые будут использовать объект test для этой переменной. Другой подход (который также может использоваться с 'IsAlive') заключается в том, чтобы аннулировать поля, которые будут использовать методы подсистемы, возможно, обнуляя их или, возможно, заменяя их ссылками на фиктивные объекты, которые будут вызывать более информативные исключения, когда попытка чтобы использовать их. Для структур данных, защищенных замками, может быть полезно обернуть блокировки в защитном устройстве, которое включает флаг «опасность» и ... – supercat
@Jimmy: ... есть код, который собирается (надеюсь, временно) нарушить инвариант, который предполагается, что всякий раз, когда блокировка освобождается, установите флаг опасности перед тем, как нарушить инвариант, и очистите его, когда восстанавливается инвариант. При вызове 'Dispose' на защите блокировки, когда установлен флаг опасности, следует аннулировать базовую структуру данных, а затем очистить блокировку; таким образом, другой код, желающий использовать структуру данных, не застрянет навсегда, ожидая блокировки, которая никогда не будет выпущена, но также не получит доступ к поврежденным данным. – supercat