Попробуй поймай в .net - PullRequest
       39

Попробуй поймай в .net

0 голосов
/ 03 февраля 2012

Я искал самый эффективный и элегантный способ сделать следующее:

  • Моя функция может быть вызвана, когда имя файла допустимо, повреждено, не существует

Функция просто десериализует объект XML.

Основные возможные результаты:

  • OK
  • Файл не существует
  • Ошибка в XML-файле

Если я напишу так, читатель не закроется в случае повреждения файла. Если я пишу reader.close () в блоке finally, он выдает предупреждение об использовании read перед присвоением ему значения.

Итак, как я могу решить это внутри саба ??

Public Function DeSerializzaXML(ByVal FileName As String, ByRef tmpObj As Object, ByVal tmpClass As Type) As Boolean
    Dim serializer As XmlSerializer
    Dim reader As StreamReader
    Dim tmpSuccess As Boolean = False
    Try
        serializer = New XmlSerializer(tmpClass)
        reader = New StreamReader(FileName)
        tmpObj = serializer.Deserialize(reader)
        reader.Close()
        tmpSuccess = True
    Catch ex As Exception
        AggiungiRigaSuFile(ErroriPath, FileName + ", " + ex.Message, Configurazione.DiagnosticaOff, True)
    Finally

    End Try

    Return tmpSuccess
End Function

Ответы [ 7 ]

5 голосов
/ 03 февраля 2012

попробуйте использовать оператор using в инициализации считывателя.если он одноразовый, то при вызове метода Dispose читатель автоматически закроет

еще от Microsoft

. В качестве альтернативы можно использовать несколько операторов catchразные типы исключений.

4 голосов
/ 03 февраля 2012

Просто инициализируйте ридер с помощью Nothing и располагайте его в блоке finally только в том случае, если это не Nothing:

Dim reader As StreamReader = Nothing
Try
    ...
Finally

    If reader IsNot Nothing Then

        reader.Dispose();

    End If

End Try

Поскольку я редко использую VB.NET, я не совсем уверен в синтаксисе, пожалуйста, исправьте ошибки самостоятельно. Идея кода должна быть ясной.

2 голосов
/ 03 февраля 2012

Проверьте, имеет ли оно значение, прежде чем получить к нему доступ.

If reader IsNot Nothing Then ...

Еще лучше, используйте блок Using, тогда вам не придется беспокоиться об окончательно.

Using reader = New StreamReader(FileName)
    ...
End Using
0 голосов
/ 04 декабря 2013

сделать это

if io.file.exist(filename) then
    return io.file.readallbytes(filename)
end if
0 голосов
/ 03 февраля 2012

Что касается попытки поймать, вы должны ловить определенные исключения

Catch ex As XmlException

или

Catch ex As IOException

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

Надеюсь, это поможет.

0 голосов
/ 03 февраля 2012
reader = New StreamReader(FileName)
Try
   ...
Finally
   reader.Dispose()
End Try

Или просто используйте Используя .

0 голосов
/ 03 февраля 2012

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

 If(File.Exists(curFile)) ...
...