Мой код постоянно выдает исключение catch, и я не знаю, почему

#c# #json #api #xamarin.forms

Вопрос:

Я создаю проект, который использует ключ доступа API для получения информации о складских данных. Пользователь вводит символ акции и нажимает кнопку, которая затем загружает всю информацию о запасах. Однако, когда вы вводите правильный биржевой символ и нажимаете кнопку для загрузки информации, он постоянно выдает мое исключение catch, которое я настроил, и я не знаю, почему. Я никогда раньше не использовал try catch, так что я делаю что-то не так?

Вот мой метод в моей SettingsTab.cs попытке получить информацию о запасах:

 async void AddStockButton_Clicked(object sender, EventArgs e)
        {
            string symbol = symbolEntry.Text.ToLower();
            //Create a try catch block to make sure the symbol exists and isn't already added in the list
            try
            {
                //Create new data manager and pass in the users chosen symbol
                DataManager dataManager = new DataManager(symbol);
                StockData newStockData = await dataManager.GetStock();
            if (stockList.Contains(newStockData))
            {
                //If stock does not exists or is a duplicate, display error alert
                //Change success label text to Unsuccessful, change color to red, amp; make visible
                await DisplayAlert("DUPLICATE STOCK", "This stock is already added to your favorites!", "OKAY");
                successLabel.Text = "Unsuccessful due to duplicate";
                successLabel.TextColor = Color.Red;
                successLabel.IsVisible = true;
            }
            else if (!stockList.Contains(newStockData))
            {
                //If stock exists and not duplicate, add that stock to a list of stockData
                //Display success alert
                //Make success label visible
                stockList.Add(newStockData);
                await DisplayAlert("STOCK ADDED", "This stock has been successfully added to your favorites!", "OKAY");
                successLabel.IsVisible = true;

                MessagingCenter.Send<StockData>(newStockData, "NewStockData");
            }

            }
            catch (WebException ex)
            {
                await DisplayAlert("API FAILED","Unable to retrieve data for that symbol. Please check that you typed it correctly or try again later.", "GO BACK");
                successLabel.Text = "Unsuccessful due to API error";
                successLabel.TextColor = Color.Red;
                successLabel.IsVisible = true;
            }
        }
 

а вот мой DataManager.cs класс, который получает API и преобразует его в json:

 public class DataManager
    {
        //This class will be responsible for pulling data from remote API
        //And putting it into the stock data opjects and passing it back to normal UI classes
        //Create variables to use
        WebClient apiConnection = new WebClient();
        //Create a string to start API
        string startAPI = "http://api.marketstack.com/v1/eod/latest?accesskey=<<ACCESS KEY REDACTED>>";
        string Symbols { get; set; }
        
        string ApiEndPoint
        {
            get
            {
                return startAPI   Symbols;
            }
        }

        public DataManager(string symbolsToDownload)
        {
            //make symbols equal to whatever gets passed in
            Symbols = symbolsToDownload;
        }

        public async Task<StockData> GetStock()
        {
            //Create a string representation of the downloaded data from ApiEndPoint
            string apiString = await apiConnection.DownloadStringTaskAsync(ApiEndPoint);

            //Create a JObject to store the apiString as a parsed JObject to get access
            //to the json formatted data
            JObject jsonData = JObject.Parse(apiString);

            //create another JObject
            JObject firstStock = (JObject)jsonData["data"][0];

            Debug.WriteLine(firstStock.ToString());

            //Create a new StockData object
            StockData stockData = new StockData();
            stockData.StockName = firstStock["symbol"].ToString();
            //We need to get the string value and parse it as a Double to define the stock Data property
            stockData.OpenPrice = Double.Parse(firstStock["open"].ToString());
            stockData.ClosePrice = Double.Parse(firstStock["close"].ToString());
            stockData.HighPrice = Double.Parse(firstStock["high"].ToString());
            stockData.LowPrice = Double.Parse(firstStock["low"].ToString());
            stockData.Volume = Double.Parse(firstStock["adj_volume"].ToString());
            stockData.Exchange = firstStock["exchange"].ToString();
            stockData.TradingDay = DateTime.Parse(firstStock["open"].ToString());

            //return the new stock data object
            return stockData;
        }
    }
 

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

Комментарии:

1. Когда вы говорите «постоянно», вы имеете в виду «постоянно»? Это означает, что он выбрасывается без выполнения вашего кода. Постоянно означает, что он выбрасывается при каждом запуске вашего кода.

2. Вы получаете исключение. Но в чем его Смысл? Также проверьте исключение InnerException. «Что-то» не так, и исключение говорит вам, что

3. Что такое ex.ToString() ?

4. Вам не следовало размещать свой ключ доступа на SO. Убедитесь, что вы получили новый.

5. Наличие исключения только для того, чтобы сообщить своим пользователям, что что-то пошло не так, без регистрации полученной информации, довольно бесполезно. Объект исключения, переданный обработчику, полон информации о том, где и почему вы получили ошибку. Просто на данный момент поместите точку останова в обработчик исключений и скажите нам, каково значение ex.Message

Ответ №1:

если вы вставите свой URL-адрес в свой браузер

 string startAPI = "http://api.marketstack.com/v1/eod/latest?accesskey=<<ACCESS KEY REDACTED>>amp;symbol=AAPL";
 

вы получите обратно это очень дружелюбное и явное сообщение об ошибке

 {
  "error":
  {
    "code": "missing_access_key",
    "message": "You have not supplied an API Access Key. [Required format: access_key=YOUR_ACCESS_KEY]"
  }
}
 

accesskey должно быть access_key

Комментарии:

1. Ключ доступа был изменен. Это не часть проблемы.

2. OP использует неправильное имя для access_key параметра

Ответ №2:

  1. Убедитесь, что значение access_key передано правильно и значение правильное.
  2. Добавьте точку останова в первую строку попытки, чтобы увидеть, где произошла ошибка.
  3. Распечатайте «ex» в catch, чтобы просмотреть конкретную информацию об ошибке.