[英]How to handle System.InvalidCastException while fetching data from a web url. (in C# WinForm)
我制作了一个程序,其中我从 url 获取付款状态,然后使用 json 解析响应。
在 WinForm 应用程序中,我通过单击从 url 接收数据来获得付款按钮,但如果传递的令牌或数据错误,则我的应用程序无法处理异常,并且不会在控制台上打印自定义错误,它仅提供 System.InvalidCastException。
这是我的 C# 程序
namespace WinFormsApp1
{
public static class RestHelper
{
static string tokenKey = System.IO.File.ReadAllText(
@"C:\Users\Asus\source\repos\WinFormsApp1\Tokken.txt"
);
static string userId = System.IO.File.ReadAllText(
@"C:\Users\Asus\source\repos\WinFormsApp1\UserId.txt"
);
private static readonly string baseURL =
"https://paymentddn.gov.in:8085/getChallanByNo/" + tokenKey + "/";
private static readonly string baseURL3 = "/" + userId;
private static readonly string baseURL1 = "https://paymentddn.gov.in:8085/dverify/";
public static async Task<string> GetAll(string challanNo)
{
try
{
using (HttpClient client = new HttpClient())
{
using (
HttpResponseMessage res = await client.GetAsync(
baseURL + challanNo + baseURL3
)
)
{
using (HttpContent content = res.Content)
{
string data = await content.ReadAsStringAsync();
if (data != null)
{
return data;
}
}
}
}
}
catch (System.Exception e)
{
Console.WriteLine(" Server Error " + e.Message);
}
return string.Empty;
}
public static string BeautifyJson(string jsonStr)
{
// JToken parseJson = JToken.Parse(jsonStr);
//return parseJson.ToString(Formatting.Indented);
string[] m = jsonStr.Split("|");
StringBuilder sb = new StringBuilder();
sb.Append("Payment Status = " + m[2]);
sb.Append("\n");
sb.Append("Challan No = " + m[5]);
sb.Append("\n");
sb.Append("Invoice = " + m[6]);
sb.Append("\n");
sb.Append("Amount = " + m[7]);
sb.Append("\n");
sb.Append("Status = " + m[8]);
sb.Append("\n");
sb.Append("Payment Mode = " + m[12]);
return sb.ToString();
}
public static async Task<string> Get(string rcpNo)
{
using (HttpClient client = new HttpClient())
{
using (HttpResponseMessage res = await client.GetAsync(baseURL1 + rcpNo))
{
using (HttpContent content = res.Content)
{
string data = await content.ReadAsStringAsync();
if (data != null)
{
return data;
}
}
}
}
return string.Empty;
}
}
}
上面的 Class 被命名为 RestHelper,我在其中获取数据并对响应进行解析
namespace WinFormsApp1 { public partial class Form1: Form { public Form1() { InitializeComponent(); }
private async void btnGetAll_Click(object sender, EventArgs e) { try { var responce = await RestHelper.GetAll(txtChallan.Text); JObject mRespose = JObject.Parse(responce.ToString()); JObject mParent = (JObject)mRespose["myObjectList"]; JObject mPaymentModel = (JObject)mParent["paymentInfoModel"]; string rcpNo = (string)mPaymentModel["receiptNo"]; Console.WriteLine("Response pay == " + rcpNo); var responce1 = await RestHelper.Get(rcpNo); txtResponce.Text = RestHelper.BeautifyJson(responce1.ToString()); // txtResponce.Text = RestHelper.BeautifyJson(responce); }catch(System.Exception d) { Console.WriteLine("Server Error"+ d.Message); } } private void label1_Click(object sender, EventArgs e) { } private void label2_Click(object sender, EventArgs e) { } private void label3_Click(object sender, EventArgs e) { } } }
这是 Form1.cs class,我在其中从 RestHelper 调用 GetAll 和 Get 方法。
我使用了 try catch 块并尝试将我的Task<string>
更改为Task<Object>
但仍然遇到相同的异常。
“WinFormsApp1.exe”(CoreCLR:clrhost):已加载“C:\Program Files\do.net\shared\Microsoft.NETCore.App\3.1.17\System.Runtime.Numerics.dll”。
Exception thrown: 'System.InvalidCastException' in WinFormsApp1.dll Exception thrown: 'System.InvalidCastException' in WinFormsApp1.dll 'WinFormsApp1.exe' (CoreCLR: clrhost): Loaded 'C:\Program Files\do.net\shared\Microsoft.NETCore.App\3.1.17\System.Text.Encoding.CodePages.dll'. The program '[29328] WinFormsApp1.exe' has exited with code 0 (0x0).
这个解决方案非常简单,而不是使用Console.Writeline
使用MessageBox.Show((string)mRespose["message"], "Server Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
.
在 Form1.cs class 中将 MessageBox 放在 catch 部分并在其中使用自定义消息。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.