2011-12-30 2 views
1

Извините за запутанное название. В основном я сделал класс BinaryReader, который читает в большой Endian и установить его конструктор в качестве:Попробуйте, поймайте внутри конструктора, который вызывает базовый конструктор

BinaryReader2(System.IO.Stream strm) : base(strm){} 

мне сказали, что вы не можете вызвать конструктор базового класса любой другой путь, и что это был лучший способ сделай это.

Проблема в том, что когда другая программа имеет контроль над файлом, который я пытаюсь прочитать, он не отображает никаких сообщений об ошибках (потому что я новичок в программировании и не настроил никаких утверждений try catch. .). Итак, я пытаюсь объяснить все возможные ситуации, используя инструкции try-catch. Я никогда не использовал их раньше, поэтому я надеялся, что смогу получить несколько указателей на него.

Я создал класс binaryreader2 во многих местах по всей программе и надеялся, что смогу настроить захват try внутри самого класса binaryreader, а не в каждом из мест, где я его использовал. Возможно ли это сделать и до сих пор вызывать конструктор базового класса?

+0

Что * * базовый класс? Часть платформы .NET или ваше собственное создание? – Adam

+2

Если у вас есть Stream, вы уже открыли файл - что вы пытаетесь защитить здесь? Нет: вы не можете добавить try/catch на время вызова base-ctor. –

+0

@MarcGravell, О да, ты прав. Я передаю файл File.Open (путь) ... Полагаю, я должен был увидеть это. Спасибо, что ответили на этот вопрос. – mowwwalker

ответ

1

Один из возможных обходных путей: Используйте композицию над наследованием. таким образом, у вас есть лучший контроль над инициализацией ранее базового объекта.

+0

Ссылка для дальнейшего чтения: http://c2.com/cgi/wiki?CompositionInsteadOfInheritance –

0

Я никогда не использовал их раньше, поэтому я надеялся, что смогу получить несколько указателей на него.

  • В общем положить Try/Поймать вокруг кода, который "выходит за пределы" для чего-то. Вещи, в которых ваша программа не контролирует. Получение файла, получение материала из базы данных и т. Д.

  • Try-Block как можно меньше кода. Например, оберните только вызов извлечения файла в Try, а не все, что происходит после этого. И.Е. как сказал @Marc выше, как только у вас есть действительный объект FileStram, нет смысла помещать его в блок Try.

  • Если вы делаете вышеуказанное, вы можете затем поймать очень конкретные типы исключений. Это позволит вам давать хорошие сообщения об ошибках по проблеме или иным образом обрабатывать проблему в коде, чтобы ваша программа не просто взорвалась.

  • Тщательно изучите разницу между повторным броском исходного исключения, создающим новый экземпляр исключения.

  • Рекомендация: Оберните свой исходный Run() в блоке Try и в Catch, сделайте что-нибудь с ним. Узнайте о «публикации». Например, вы можете отправить электронное письмо. Создайте исключение в базе данных, напишите в файл журнала.

  • С выше, то в каждый Поймайте везде в вашем приложении, всегда повторно бросок (см мое предупреждение выше) исключение и у вас есть один момент, когда вы делаете что-то полезное с ним.

+0

Когда я попытался инициализировать поток filestream внутри оператора try catch, он не позволит мне использовать его нигде, потому что он сказал, что он не инициализирован. То же самое, когда я сначала установил значение null. – mowwwalker

+0

Не уверен, что означает «инициализация». Если вы объявили его в блоке try, то его область ограничена этим блоком. – radarbob