重构代码以排除try catch场景,最佳实践?

时间:2015-08-25 11:44:18

标签: c# exception unity3d exception-handling try-catch

由于Unity3D在浏览器中通过WebGL的工作方式,try / catch的捕获部分会立即导致游戏崩溃。这主要是因为它不支持发布版本。 (有调试版本可以使用try / catch,但这也会产生影响) 最后,我必须重构一些代码,不使用任何try / catch,以防止它为用户锁定。

以下是我目前的情况:

try{
        using (StreamReader reader = new StreamReader(Application.persistentDataPath+"/"+"CHARVER.BIN"))
        {
            JSONNode characterImages;
            string json = reader.ReadToEnd();
            if(string.IsNullOrEmpty(json)){
                throw new System.IO.FileNotFoundException();
            }else{  
                characterImages = JSON.Parse(json);
                //test the image file inside
                Texture2D loadedImage = new Texture2D(1,1,TextureFormat.ARGB32,false);
                try{
                    loadedImage.LoadImage(File.ReadAllBytes(Application.persistentDataPath + characterImages ["Characters"][0]["texture"]));
                    if(!loadedImage){
                        throw new System.IO.FileNotFoundException();
                    }
                }
                catch(System.Exception ex){
                    Debug.LogError("[DOWNLOAD]Test image file was not found: "+ex);
                    ThrowBackToLogin("No image file was found.");
                    yield break;
                }
            }
        }
    }catch(System.Exception ex){
        Debug.Log("[DOWNLOAD]Test file was not found: "+ex);
        ThrowBackToLogin("No version file found.");
        yield break;
    }

我怎么能重构这个以删除try-catch部分?我不可能手动避免File.RealAllBytes可以向我抛出的所有异常,对吧?我可以想象只是调用一个“异常消息”方法来接收消息并响应失败的检查并“返回”;紧接着,(以替换抛出新的System.IO.FileNotFoundException();)因为我自己抛出它。但是,对于我无法控制的更先进的方法,它是如何工作的?

提前致谢 -Smiley

1 个答案:

答案 0 :(得分:1)

好的呢?

using (StreamReader reader = new StreamReader(Application.persistentDataPath+"/"+"CHARVER.BIN"))
{
    JSONNode characterImages;
    string json = reader.ReadToEnd();

    if(!string.IsNullOrEmpty(json))
    {
        characterImages = JSON.Parse(json);
        //test the image file inside
        Texture2D loadedImage = new Texture2D(1,1,TextureFormat.ARGB32,false);

        if(characterImages.Keys.Contains("Characters")
            && characterImages["Characters"].Count() > 0
            && characterImages["Characters"][0].Keys.Contains("texture"))
        {
            if(loadedImage.LoadImage(File.ReadAllBytes(Application.persistentDataPath + characterImages["Characters"][0]["texture"])))
                return;
        }
    }
    ThrowBackToLogin("No image file was found.");
}