PDA

View Full Version : سوال: جلوگیری از نمایش ارور های اشکال(مقادیر ورودی و...) در سی شارپ



armsoftpc
دوشنبه 29 خرداد 1391, 18:34 عصر
به نام خدا
با سلام
این سوال یکی از مهم ترین سوالات به نظر خود من است، در تصویر که ضمیمه کرده ام ، این شکل از ارور را میبیند، اگر بخواهیم با این ارور مقابله کنیم باید از try/catch استفاده کنیم ، حالا شما فرض کنید که برنامه ی ما چندین هزار خط کد دارد ، ما که نمی توانیم برای قسمت به قسمت از try/catch استفاده کنیم، حالا راه حل برای حذف کامل این ارور ها (وقتی برنامه را انتشار میدهیم، که کاربر دیگر به هیچ وجه این پیام ها را نبینید که کار ما لو برود) چیست؟:متفکر:
88415

mousa1992
دوشنبه 29 خرداد 1391, 18:44 عصر
سلام
من نمیدونم ایا میشه این کارو انجام داد یا نه ولی اینو میدونم که مدیریت استثناها موضوع مهمیه و نمیشه ازش گذشت!
اگه به کاربرت پیام مناسب رو نده از کجا بفهمه مشکل برنامه چیه ؟! به نظرم باید از try/catch استفاده کنی هرچند هزار خط که باشه !

armsoftpc
دوشنبه 29 خرداد 1391, 18:58 عصر
محال کسانی که سی شارپ رو طراحی کردند ، به این فکر نبوده باشند ، بلوک ترای/کچ بسیار خسته کننده است، منظور از چند هزار خط کد مثلا 40000 خط کد باشه ، اونوقت می خوای چی کار کنی ، تازه هرچی ترای/کچ بنویسی باز ممکنه ، یه سری ارور از زیر دستت در بره و به کاربر نشون بده.

اگه به کاربرت پیام مناسب رو نده از کجا بفهمه مشکل برنامه چیه ؟!
مثلا به نظر شما کاربر میتونه بفهمه مشکل برنامه کجاست:لبخند: ، اونم کاربران مخاطب ما اصلا نمیدونند برنامه نویسی چی هست:ناراحت:، اصلا بهتر که مشکل برنامه مشخص نشه!(برای کاربر)، برای نمایش پیام هم یه نوع پیام دیفالت در نظر میگیریم که این مشکل رو هم حل کنه!

MOTO MAN
دوشنبه 29 خرداد 1391, 19:09 عصر
سلام دوست عزیز

شما در فایل Program.cs که نقطه شروع همه ی پروژه هاست در ابتدای تابع main کد زیر را اضافه نمایید:

Application.ThreadException += new ThreadExceptionEventHandler(Application_ThreadExce ption);

سپس این متد را که متد event فوق هست را در پایین تابع main اضافه کنید.

static void Application_ThreadException(object sender, ThreadExceptionEventArgs e)
{
MessageBox.Show(e.Exception.Message);
}

با این کار تمامی exception هایی که در برنامه رخ می دهد به این نقطه هدایت می شود و شما می توانید آن ها را مدیریت کنید.

در ضمن کد بالا را اگه با تعریف event آشنایی داشته باشید می تونستید به این صورت تعریف کنید.

Application.ThreadException بعد =+ بعد هم دوبار tab را بزنید.


موفق باشید...

hunter_ara
دوشنبه 29 خرداد 1391, 19:11 عصر
به نام خدا
با سلام
این سوال یکی از مهم ترین سوالات به نظر خود من است، در تصویر که ضمیمه کرده ام ، این شکل از ارور را میبیند، اگر بخواهیم با این ارور مقابله کنیم باید از try/catch استفاده کنیم ، حالا شما فرض کنید که برنامه ی ما چندین هزار خط کد دارد ، ما که نمی توانیم برای قسمت به قسمت از try/catch استفاده کنیم، حالا راه حل برای حذف کامل این ارور ها (وقتی برنامه را انتشار میدهیم، که کاربر دیگر به هیچ وجه این پیام ها را نبینید که کار ما لو برود) چیست؟:متفکر:
88415

1 سری از کد ها امکان خطا نداره ولی 1 سری دیگه مثل کار با فایل یا ... امکان خطای زیادی دارن!
شما باید این طور کد ها رو داخل Try بزارید!
نه این که کل برنامه رو داخل Try بزارید!
این اصلا عاقلانه نیست!

armsoftpc
دوشنبه 29 خرداد 1391, 19:24 عصر
شما باید این طور کد ها رو داخل Try بزارید!
من همینه رو می گم و منظور این که فکر کن ، چقدر تعداد ترای/کچ ها زیاد میشه، در صورتی که من در php برنامه ای که نوشتم(بیش از 6000 خط) ، حتی 1 ترای/کچ هم نداره!
وقتی دستواتی همانند if هستند ، چه نیاز است به ترای/کچ

شما در فایل Program.cs که نقطه شروع همه ی پروژه هاست در ابتدای تابع main کد زیر را اضافه نمایید:
دوست عزیز مرسی ، اما نمی دونم چرا سی شارپ به 2 تکه خط کد ThreadExceptionEventHandler و ThreadExceptionEventArgs ارور میده و زیرش خط قرمز میکشه!

MOTO MAN
دوشنبه 29 خرداد 1391, 19:54 عصر
دوست عزیز مرسی ، اما نمی دونم چرا سی شارپ به 2 تکه خط کد ThreadExceptionEventHandler و ThreadExceptionEventArgs ارور میده و زیرش خط قرمز میکشه! خواهش می کنم.

احتمال داره بد استفاده می کنید کد را. این جوری که می گم عمل کنید.

شما داخل متد Main برنامه در اولین خط متد(دقت کنید باید قبل از همه ی دستورات نوشته شود) بنویسید Application.ThreadException سپس یک به علاوه و یک مساوی ( =+) گذاشته و دوبار کلید Tab را بزنید تا ویژوال استادیو خودش متد صحیح را تعریف کند.

سپس داخل متد تعریف شده توسط ادیتور رفته و از طریق پارامتر e خطای مورد نظر را هندل کنید.

اینم شکل کلیش که براتون قرار دادم.(دقت کنید بعضی جاها مثل fals e را اینجوری نوشته که همون false هست)

موفق باشید...

using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows.Forms;
using System.Threading;

namespace DataGridUpdate
{
static class Program
{
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main()
{
Application.ThreadException += new ThreadExceptionEventHandler(Application_ThreadExce ption);
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(fals e);
Application.Run(new Form1());
}

static void Application_ThreadException(object sender, ThreadExceptionEventArgs e)
{
MessageBox.Show(e.Exception.Message);
}
}
}

armsoftpc
دوشنبه 29 خرداد 1391, 20:11 عصر
سپس داخل متد تعریف شده توسط ادیتور رفته و از طریق پارامتر e خطای مورد نظر را هندل کنید.طبق حرفتون اولی درست شد ، اما دومی هنوز ارور میده (ThreadExceptionEventArgs) انگار سی شارپ این نوع را نمی شناسد.
اولی رو همونطور که گفتید ، بصورت تایپی رفتم و ویژوال استودیو بهش System.Threading اضافه کرد.
دومی هم اگه این رو بهش اضافه کنم ، ارور حل میشه ، اما دوباره بدلیل مشکل پارامتری اولی ارور میده!!!
اینم تصاویرش:

88417

88418
البته این رو هم اضافه کنم ، که کد قبلی شما بدون وارد کردن پیش دستورات سیستم ، با استفاده از using درست میشد، اما این روش هم مانند بالا ارور میده!

MOTO MAN
دوشنبه 29 خرداد 1391, 20:35 عصر
سلام

ببخشید یادم رفت که بگم System.Threading را باید using کنید.

دلیل اینکه که در عکس دومی که قرار دادید خطا می گیرید اینه که دو تا متد همنام به نام Application_ThreadException تعریف کردید. ترجیحا متد اولی را پاک کنید تا خطای مورد نظری که برنامه می ده را داخل MessageBox مشاهده کنید.

موفق باشید...

armsoftpc
دوشنبه 29 خرداد 1391, 21:57 عصر
با سلام

ببخشید یادم رفت که بگم System.Threading را باید using کنید.
بزرگوارید.
من اصلا خودم حواسم نبود که 2 تابع با یک نام تعریف شده است ، به هر حال کار کرد.
بسیار متشکرم
موفق و پیروز باشید.

sghmsghm
یک شنبه 10 خرداد 1394, 11:38 صبح
سلام خسته نباشیدمن جدیدا دارم باسی شارپ کارمیکنم
میخوام درج در دیتابیس بادیتاگریدویی انجام بدم.درفرم یک بازدن کلید درج به فرم دو منتقل میشه واطلاعات واردمیشه وسپس بازدن کلیددرج ذخیره بشه و الان ارور میده ممنون میشم اگه کسی کمکم کنه.
کلیدهای ویرایش وحذفم که میخوام کارکنه
تشکردوستان
http://uplod.ir/5451sqm0zs5q/WindowsFormsApplication1.zip.htm

ebrahim.rayatparvar
یک شنبه 10 خرداد 1394, 11:50 صبح
سلا مهندس جان.
بهتر نیست پیغام خطا خوددت رو انجا بزاری تا ببینیم.