捕获预期的例外情况

mpe*_*pen 2 c# exception

我有代码看起来像这样,因为我检查某些数据是否是图像的唯一可靠方法是实际尝试加载它像图像.

    static void DownloadCompleted(HttpConnection conn) {
        Image img;
        HtmlDocument doc;

        try {
            img = Image.FromStream(conn.Stream);
        } catch {
            try {
                doc = new HtmlDocument();
                doc.Load(conn.Stream);
            } catch { return; }
            ProcessDocument(doc);
            return;
        }
        ProcessImage(img);
        return;
    }
Run Code Online (Sandbox Code Playgroud)

哪个看起来很糟糕!

处理这些情况的好方法是什么?你基本上被迫使用像if声明这样的例外?

Eri*_*ric 6

你的逻辑结构是

if( /* Loading Image Fails */ )
    /* Try Loading HTML */
Run Code Online (Sandbox Code Playgroud)

所以我会尝试以这种方式读取代码.引入辅助方法可能是最干净的(尽管通常令人讨厌).

bool LoadImage()
{
    Image img;
    try 
    {
        img = Image.FromStream(conn.Stream);
    } 
    catch( NotAnImageException /* or whatever it is */ )
    {
        return false;
    }

    ProcessImage(img);
    return true;
}


bool LoadDocument()
{
   // etc
}
Run Code Online (Sandbox Code Playgroud)

所以你可以写

if( !LoadImage() )
   LoadDocument();
Run Code Online (Sandbox Code Playgroud)

或者扩展到:

if( !LoadImage() && !LoadDocument() )
{
     /* Complain */
}
Run Code Online (Sandbox Code Playgroud)