Обработка исключений в C # - Как? - PullRequest
3 голосов
/ 07 января 2011

Используя оптическое распознавание MODI (Microsoft Office Document Imaging), иногда изображение не содержит текста. Поэтому doc.OCR выдает исключение.

    public static string recognize(string filepath, MODI.MiLANGUAGES language = MODI.MiLANGUAGES.miLANG_RUSSIAN, bool straightenimage = true)
    {
        if (!File.Exists(filepath)) return "error 1: File does not exist";
        MODI.Document doc = new MODI.Document();
        doc.Create(filepath);

        try
        {
            doc.OCR(language, false, false);
        }
        catch
        {
            //
        }
        MODI.Image image = (MODI.Image)doc.Images[0];

        string result="";
        foreach (MODI.Word worditems in image.Layout.Words)
        {
            result += worditems.Text + ' ';
            if (worditems.Text[worditems.Text.Length - 1] == '?') break;
        }


        doc.Close(false);
        System.Runtime.InteropServices.Marshal.ReleaseComObject(doc);
        System.Runtime.InteropServices.Marshal.FinalReleaseComObject(doc);
        System.Runtime.InteropServices.Marshal.ReleaseComObject(image);
        System.Runtime.InteropServices.Marshal.FinalReleaseComObject(image);
        image = null;
        doc = null;
        GC.Collect();
        GC.WaitForPendingFinalizers();

        return result;

    }

Этот код завершает приложение, а не то, что мне нужно: (

Как мне просто заставить его исчезнуть, как будто ничего не случилось?

Ответы [ 2 ]

2 голосов
/ 07 января 2011

Вы находитесь на 95% пути с кодом, который вы отправили:

try
{
    doc.OCR(language, false, false);
}
catch
{
    // Here you would check the exception details
    // and decide if this is an exception you need
    // and want to handle or if it is an "acceptable"
    // error - at which point you could popup a message
    // box, write a log or doing something else
}

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

try
{
    doc.OCR(language, false, false);
}
catch (DocumentEmptyException dex)
{
}
catch
{
}

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

РЕДАКТИРОВАТЬ (После просмотра вашего редактирования)

Вы уверены, что исключение выдается из метода doc.OCR(...)? В вашем редакторе вы добавили дополнительный код после перехвата, может ли он быть оттуда вместо этого?

Например, строка после улова:

MODI.Image image = (MODI.Image)doc.Images[0];

Если ваш документ пуст и, следовательно, исключение выдается и игнорируется (так как в блоке catch ничего нет), эта строка продолжает работать?

1 голос
/ 07 января 2011

Вы ничего не делаете в блоке catch, просто глотаете исключение, что очень плохо.Код продолжает выполняться, и вы пытаетесь использовать переменную doc, но из-за сбоя вызова .OCR более чем возможно, что позже будет выдано другое исключение.Например, doc.Images[0] может произойти сбой при сбое распознавания текста.Поэтому либо прекратите выполнение метода, возвращая что-либо, либо поместите весь метод в блок try / catch.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...