当我打电话
webBrowser1.Document.GetElementsByTagName("img")[109].GetAttribute("src")
该程序与IndexOutOfRangeException
崩溃。但是,当我打电话时
webBrowser1.Document.GetElementsByTagName("img")[99].GetAttribute("src")
程序成功运行,没有抛出异常。唯一的区别是99对109,为什么会导致崩溃?
答案 0 :(得分:3)
当调用者尝试获取超出集合边界的元素时,抛出IndexOutOfRangeException
。如果集合有10个项目,并且您尝试访问第10个,第11个或第100个索引,则会抛出此异常。
当抛出异常并且未处理时,运行时将终止您的程序(即您的程序将"崩溃")。您可以找到有关C#异常和异常处理here的更多信息。
这就是你发生的事情;也许只有100个项目,第99个索引是集合中的最后一个项目。在任何情况下,索引109都没有项目,因此抛出此异常。如果未处理异常,CLR将终止您的程序。
为了防止抛出此异常,请务必检查数组的大小并请求这些边界内的项目。
例如:
~/.gitconfig
您还可以使用int numberOfImages = webBrowser1.Document.GetElementsByTagName("img").Count;
for(int i = 0; i < numberOfImages; i++)
{
var src = webBrowser1.Document.GetElementsByTagName("img")[i].GetAttribute("src");
//use src here
}
完全避免令人讨厌的int
索引器:
foreach
答案 1 :(得分:0)
private void Form1_Load(object sender, EventArgs e)
{
webBrowser1.ScriptErrorsSuppressed = true;
webBrowser1.Navigate("https://it.images.search.yahoo.com/images");
}
int a = 1;
private async void button1_Click(object sender, EventArgs e)
{
if (a == 1)
{
webBrowser1.Document.GetElementById("yschsp").InnerText = textBox1.Text;
webBrowser1.Document.GetElementsByTagName("input")[1].InvokeMember("click");
do
{
Application.DoEvents();
} while (webBrowser1.ReadyState != WebBrowserReadyState.Complete);
await PutTaskDelay();
pictureBox1.ImageLocation = webBrowser1.Document.GetElementsByTagName("img")[0].GetAttribute("src");
a = a + 1;
}
else
{
webBrowser1.Document.GetElementById("yschsp").InnerText = textBox1.Text;
webBrowser1.Document.GetElementById("sbx_x").InvokeMember("click");
do
{
Application.DoEvents();
} while (webBrowser1.ReadyState != WebBrowserReadyState.Complete);
await PutTaskDelay();
pictureBox1.ImageLocation = webBrowser1.Document.GetElementsByTagName("img")[0].GetAttribute("src");
}
}
async Task PutTaskDelay()
{
await Task.Delay(1000);
}