3

try ブロック内の URL から取得した画像を返せないのはなぜですか? 下手な英語でごめんなさい:(。

これは私が得るエラーです:

返品明細書がありません

    public static Image GetExternalImg(string name, string size)
    {
        try
        {
            // Get the image from the web.
            WebRequest req = WebRequest.Create(String.Format("http://www.picturesite.com/picture.png", name, size));
            // Read the image that we get in a stream.
            Stream stream = req.GetResponse().GetResponseStream();
            // Save the image from the stream that we are rreading.
            Image img = Image.FromStream(stream);
            // Save the image to local storage.
            img.Save(Environment.CurrentDirectory + "\\images\\" + name + ".png");
            return img;
        }
        catch (Exception)
        {

        }
    }

私は今行き詰まっているので、助けていただければ幸いです:(。

4

9 に答える 9

7

可能なすべての実行パスから戻る必要があります。

したがって、失敗した場合は、関数または関数の最後tryから何かを返す必要があります。catch

ノート:

空のcatchブロックを持つべきではありません - 例外を飲み込むことは本当に悪い習慣であり、デバッグや例外の発生源を見つけることを非常に困難にします。

関数を次のように記述します。

public static Image GetExternalImg(string name, string size)
{
    // Get the image from the web.
    WebRequest req = WebRequest.Create(String.Format("http://www.picturesite.com/picture.png", name, size));
    // Read the image that we get in a stream.
    Stream stream = req.GetResponse().GetResponseStream();
    // Save the image from the stream that we are rreading.
    Image img = Image.FromStream(stream);
    // Save the image to local storage.
    img.Save(Environment.CurrentDirectory + "\\images\\" + name + ".png");
    return img;
}

ブロックに何かがある場合は、ログに記録した後catchに例外をスローするか ( ) を返します。throw;null

于 2012-05-09T17:29:00.900 に答える
2

try ブロックからオブジェクトを返すことができます。すべての実行パスがそのオブジェクトを返すようにする必要があります。

try ブロックで画像を取得した場合:

public Image GetPicture()
{
    try
    {
       Image image = GetImageFromDb();
       return image;
    }
    catch(Exception ex)
    {

    }
}

GetImageFromDb() の呼び出し中に例外がスローされた場合、コントロールは catch ブロックに渡されます。これは、return ステートメントをスキップすることを意味します。呼び出し元は、制御が呼び出し元に戻されるときに戻り値を期待します。

var callerVariable = GetPicture();

ここで、割り当てを実行するために、catch から値を返す必要があります。参照型を扱っているため、null を返すことができます (null が有効な実行状態であると仮定します)。キャッチを更新します

catch(Exception ex)
{
  return null;
}
于 2012-05-09T17:48:43.330 に答える
2

画像の読み込みに失敗したときに null を返すことが受け入れられる場合は、次のことができます。

public static Image GetExternalImg(string name, string size)
    {
        try
        {
            // Get the image from the web.
            WebRequest req = WebRequest.Create(String.Format("http://www.picturesite.com/picture.png", name, size));
            // Read the image that we get in a stream.
            Stream stream = req.GetResponse().GetResponseStream();
            // Save the image from the stream that we are rreading.
            Image img = Image.FromStream(stream);
            // Save the image to local storage.
            img.Save(Environment.CurrentDirectory + "\\images\\" + name + ".png");
            return img;
        }
        catch (Exception)
        {
              //grab an image from resource
              return theDefaultImage;
        }
    }

それ以外の場合、例外がキャッチされたときにメソッドは何を返す必要がありますか? さらに、上記のように例外を非表示にしないでください。これは本当に最悪の方法です。

于 2012-05-09T17:30:28.190 に答える
1

例外がスローされるため、try を終了するときにケースを処理する return ステートメントが必要です。

すべてのコード パスには戻りが必要ですが、そうでないものがあります。つまり、try ブロックに入り、例外をスローしてから、catch に飲み込みます。キャッチを離れた後は、リターンはありません。

ちなみにトップレベルExceptionタイプを飲み込むのは邪道。やらないでください。

于 2012-05-09T17:28:51.880 に答える
0

お客様の場合、イメージを返す保証はありません。そのため、何かを返すか、例外を再スローする必要があります。

于 2012-05-09T17:30:59.190 に答える
0

例外がある場合、何も返されないためです。キャッチするとnullが返されるか、完全なメソッドがnullを返す必要があります。

以下の 2 つの return ステートメントのいずれかを使用できます。

public static Image GetExternalImg(string name, string size)
    {
        try
        {
            // Get the image from the web.
            WebRequest req = WebRequest.Create(String.Format("http://www.picturesite.com/picture.png", name, size));
            // Read the image that we get in a stream.
            Stream stream = req.GetResponse().GetResponseStream();
            // Save the image from the stream that we are rreading.
            Image img = Image.FromStream(stream);
            // Save the image to local storage.
            img.Save(Environment.CurrentDirectory + "\\images\\" + name + ".png");
            return img;
        }
        catch (Exception)
        {
            //return null;
        }

        //return null;
    }
于 2012-05-09T17:28:54.057 に答える
0

「catch」ブロックに return ステートメントがありません。

img.Saveが例外をスローした場合、 に入りcatch、 を離れて、catchを決してヒットしませんreturn。例えば:

public static Image GetExternalImg(string name, string size)
{
    try
    {
        // Code here
        return img;
    }
    catch (Exception)
    {
        return null;
    }
}
于 2012-05-09T17:29:29.967 に答える
0

関数には、return考えられるすべてのコード パスが含まれている必要があります。ここで考えられるコード パスの 1 つは、ブロックの本体がtryブロック内で処理される例外をスローすることcatchです。ブロックを含むコード パスにはcatchreturn ステートメントがないため、不正です。

catchブロックから、returnまたはthrowステートメントが存在する必要があります

于 2012-05-09T17:30:15.543 に答える
0

どうぞ:

  public static Image GetExternalImg(string name, string size)
        {
            try
            {
                // Get the image from the web.
                WebRequest req = WebRequest.Create(String.Format("http://www.picturesite.com/picture.png", name, size));
                // Read the image that we get in a stream.
                Stream stream = req.GetResponse().GetResponseStream();
                // Save the image from the stream that we are rreading.
                Image img = Image.FromStream(stream);
                // Save the image to local storage.
                img.Save(Environment.CurrentDirectory + "\\images\\" + name + ".png");
                return img;
            }
            catch (Exception)
            {

            }
        return null;

        }
于 2012-05-09T17:30:49.157 に答える