C#newbie - 如果在哪里,如果在哪里,如果等等& try-catch里面的try-catch在另一个try-catch里面

时间:2013-11-29 05:08:36

标签: c# windows-phone-8

请原谅C#@ Windows Phone开发的新手,我开始这是因为我想为我的Windows Phone编写一个天气应用程序,希望这不是一个愚蠢的理由。 也为我可怜的英语道歉。

大多数情况下,我的代码是copy&从互联网粘贴,我也从Stackoverflow找到了很多帮助,我非常感谢你!

到目前为止,我的代码运行得很好,我只是有一些关于代码结构或编码行为的新手问题,或者别的什么。

您可以看到我的代码部分如下(您可以忽略详细信息,但只关心if和try-catch块):

StreamReader LastReader = null;
if (IsolatedStorageSettings.ApplicationSettings.Contains("UpdateAllDay"))
{
    try
    {
        if (IsolatedStorageSettings.ApplicationSettings["UpdateAllDay"].ToString() == "false")
        {
            try
            {
                if (IsolatedStorageSettings.ApplicationSettings.Contains("UpdateStartTime") && IsolatedStorageSettings.ApplicationSettings.Contains("UpdateEndTime"))
                {
                    try
                    {
                        if (DateTime.Now > Convert.ToDateTime(IsolatedStorageSettings.ApplicationSettings["UpdateStartTime"].ToString()) && DateTime.Now < Convert.ToDateTime(IsolatedStorageSettings.ApplicationSettings["UpdateEndTime"].ToString()))
                        {
                            IsolatedStorageFile isoFile = IsolatedStorageFile.GetUserStoreForApplication();
                            if (IsolatedStorageSettings.ApplicationSettings.Contains("UpdateRate") && isoFile.FileExists("LastUpdateTime.txt"))
                            {
                                try
                                {
                                    LastReader = new StreamReader(new IsolatedStorageFileStream("LastUpdateTime.txt", FileMode.Open, isoFile));                                                    
                                    if ((DateTime.Now - Convert.ToDateTime(LastReader.ReadLine())).TotalSeconds >Convert.ToInt32(IsolatedStorageSettings.ApplicationSettings["UpdateRate"].ToString()))
                                    {
                                        LastReader.Close();
                                        if (IsolatedStorageSettings.ApplicationSettings.Contains("CityID"))
                                        {
                                            HttpClient client = new HttpClient();
                                            string url = "http://m.weather.com.cn/data/{0}.html";
                                            string baseUrl = string.Format(url, IsolatedStorageSettings.ApplicationSettings["CityID"].ToString());
                                            try
                                            {
                                                string WeatherResult = await client.GetStringAsync(baseUrl);

                                                if (WeatherResult != null)
                                                {
                                                    StreamWriter Writer = new StreamWriter(new IsolatedStorageFileStream("WeatherResult.txt", FileMode.OpenOrCreate, isoFile));
                                                    Writer.WriteLine(WeatherResult);
                                                    Writer.Close();

                                                    RootWeatherCore apiData = JsonConvert.DeserializeObject<RootWeatherCore>(WeatherResult);
                                                    await GetData(apiData);

                                                    StreamWriter LastUpdateTime_Writer = new StreamWriter(new IsolatedStorageFileStream("LastUpdateTime.txt", FileMode.OpenOrCreate, isoFile));
                                                    LastUpdateTime_Writer.WriteLine(DateTime.Now);
                                                    LastUpdateTime_Writer.Close();

                                                    return "true";
                                                }
                                            }
                                            catch (Exception) { return "1"; }
                                        }
                                    }

                                }
                                catch (Exception) { return "1"; }
                            }
                        }
                        return "1";
                    }
                    catch (Exception) { return "1"; }
                }
            }
            catch (Exception) { return "1"; }
        }
        else
        {
            IsolatedStorageFile isoFile = IsolatedStorageFile.GetUserStoreForApplication();
            if (IsolatedStorageSettings.ApplicationSettings.Contains("UpdateRate") && isoFile.FileExists("LastUpdateTime.txt"))
            {
                try
                {
                    LastReader = new StreamReader(new IsolatedStorageFileStream("LastUpdateTime.txt", FileMode.Open, isoFile));
                    if ((DateTime.Now - Convert.ToDateTime(LastReader.ReadLine())).TotalSeconds > Convert.ToInt32(IsolatedStorageSettings.ApplicationSettings["UpdateRate"].ToString()))
                    {
                        LastReader.Close();
                        if (IsolatedStorageSettings.ApplicationSettings.Contains("CityID"))
                        {
                            HttpClient client = new HttpClient();
                            string url = "http://m.weather.com.cn/data/{0}.html";
                            string baseUrl = string.Format(url, IsolatedStorageSettings.ApplicationSettings["CityID"].ToString());
                            try
                            {
                                string WeatherResult = await client.GetStringAsync(baseUrl);

                                if (WeatherResult != null)
                                {
                                    StreamWriter Writer = new StreamWriter(new IsolatedStorageFileStream("WeatherResult.txt", FileMode.OpenOrCreate, isoFile));
                                    Writer.WriteLine(WeatherResult);
                                    Writer.Close();

                                    RootWeatherCore apiData = JsonConvert.DeserializeObject<RootWeatherCore>(WeatherResult);
                                    await GetData(apiData);

                                    StreamWriter LastUpdateTime_Writer = new StreamWriter(new IsolatedStorageFileStream("LastUpdateTime.txt", FileMode.OpenOrCreate, isoFile));
                                    LastUpdateTime_Writer.WriteLine(DateTime.Now);
                                    LastUpdateTime_Writer.Close();

                                    return "true";
                                }
                            }
                            catch (Exception) { return "1"; }
                        }
                    }
                }
                catch (Exception) { return "1"; }
            }
            return "1";
        }
    }
    catch (Exception) { return "1"; }
}

会吓到你吗?实际上,当我把它写出来时,我很害怕。它看起来有点难看或结构不合理,不是吗? 所以,我的问题是,在另一个if块中使用if块的过多循环,并在另一个try-catch块中使用try-catch块是一个好的做法或行为吗?

我有很多if if因为我认为应用程序在不同条件下的功能会有所不同。 我使用try-catch很多因为我需要处理Windows Phone环境中的Isolated Storage,这是Stackoverflow和其他网站的许多大师建议的。

这是正常的编码结构还是行为?然后我应该习惯它。 或者有一种我不知道的更好的方法吗?

或者使用单个&amp; “大”的try-catch将所有代码放入其中? (如果我不在乎什么是确切的例外)

任何建议或意见都将不胜感激,谢谢!

2 个答案:

答案 0 :(得分:1)

这种结构肯定看起来过于复杂。我认为您将拥有如此多嵌套try...catch块的唯一原因是您认为某些操作可能因特定原因而失败。

以这种方式进行处理的问题在于如何以及何时在一个嵌套捕获中处理异常。

如果是这种情况,您可以为单个catch提供多个try语句。

这样的事情:

try
{
 //Do Something
}
catch(<ExceptionType1> e1) {}
catch(<ExcetionType2> e2){}
catch(Exception e){}

或者,如果你不关心异常,你可以简单地拥有一个捕获所有

的常规捕获
try
{
 //Do Something
}
catch {}

答案 1 :(得分:0)

对于初学者来说,在彼此内部尝试阻止不会做任何事情,因为他们没有捕获不同的例外。 你的catch块返回1.并且函数在返回函数时结束。所以你所有的try / catch都相当于一个大块。

一般来说,避免这么多嵌套if是一个好主意。我不熟悉Windows手机编程,但一个好的面向对象的解决方案是编写这样的函数

boolean isCorrectCondition(ApplicationSetting as)
{
    return condition1 && condition2 && ... && last condition;
}

而不是你的if语句的monstrous nest有类似

的东西
if(isCorrectCondition(as)) {
// do something here
}