PDA

View Full Version : سوال: آیا نیاز هست در برنامه خطا ها رو برای کاربر ترجمه کرد چه خطا هایی رو باید براش مشخص کرد؟



Mosafers
پنج شنبه 16 خرداد 1392, 12:42 عصر
سلام دوستان در یه برنامه دیدم که یکی از دوستان در برنامه اش خطا ها رو به صورت فارسی در یه فرم نمایش میداد میخواستم بدونم در برنامه خودم که یه برنامه حسابداری کوچیک هست مثلا چه خطا هایی رو باید برطرف کنم ؟
اصلا مدیریت خطا باید به چه شکل باشه؟

با تشکر

danialafshari
پنج شنبه 16 خرداد 1392, 12:58 عصر
سعی کن با Try و Catch مدیریت کنی و پیامش رو می تونی فارسی و کلی بزاری
ترجمه فارسی یه حسنی که داره باعث نامفهوم شدن متن در Analyze میشه و برای امنیت بهتره

programer97
پنج شنبه 16 خرداد 1392, 14:27 عصر
سلام بوسیله ی TRy و catch پیام هاتو مدیریت کن.
وبرای هر گروه از پیام ها یک پیغام رو چاپ کن. هر چقدر کاربر از دلیل اصلی مشکلات برنامه کمتر بدونه بهتره.
مثلا برای همه ارور های بانک اطلاعاتی فقط پیام "مشکل در ارتباز با بانک اطلاعاتی" رو چاپ کن.

Mosafers
پنج شنبه 16 خرداد 1392, 14:43 عصر
میشه خواهش کنم یه نمونه برام قرار بدید اصلا این سر در نمیارم باید چیکار کنم میتونم خطا ها رو با try , catch پنهان کنم اما نمیدونم چظور باید یه خطا رو ترجمه کنم و به کاربر نمایش بدم مثلا بگه مشکل در اتصال به دیتابیس ؟؟؟؟؟؟

omiditc
پنج شنبه 16 خرداد 1392, 14:52 عصر
همانطور که دوستان گفتند مدیریت خطاها با Try-Catch امکان پذیره.دستورالعمل و نمونه کدشو اگه سرچ کنی پیدا میشه.بعد از پیاده سازی کد برای مدیریت بهتر برای هر ارور یه کد به متن ارور بده.مثلا "ارور 888 : خطا در بانک اطلاعاتی" . اینطوری اگه برنامه این ارور رو داد برای دیباگ کردنش با Ctrl+F سرچ میکنی "ارور 888" و منتقل میشی به محل ارور و توی سرعت دیباگ کردن و سردرگم نشدن خیلی تاثیر داره.مخصوصا اگه یکی خواسته باشه تلفنی ارور رو بهت بگه !

davidrobert
پنج شنبه 16 خرداد 1392, 14:57 عصر
این دستور برای جلوگیری خطا هستش که اگه دیتابیس وجود نداشت یا ادرس اشتباه بود پیغام خطا رو بده این دستور در کلاس نوشته شده و در فرم اصلی صدا شده میشه دستور در کلاس.public void Connect()
{
try
{
string cs = "";
if (isExpress)
{
cs = @"Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirector y|\DBHesabDarePoshakSayeBan.mdf;Integrated Security=True;User Instance=True";
}
else
{
cs = @"server=" + Server + ";database=" + DataBase + ";trusted_connection=yes;";
//cs = @"server=" + server + ";database=" + database + ";uid=" + user + ";pwd=" + password + ";";
}
con.ConnectionString = cs;
con.Open();
}
catch (Exception ex)
{
if (!ShowFriendMessage)
LastError = ex.Message;
else
LastError += "اشکال در ارتباط با دیتابیس / با مدیر برنامه تماس حاصل فرمایید / خطا 100";
}
}
فراوخانی دستور در فرم میگیم
try
{
db.Connect();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
MessageBox.Show("خطا در ارتباط با پایگاه داده)");
}

Mosafers
پنج شنبه 16 خرداد 1392, 15:34 عصر
با سلامدوباره از تمامی دوستان به خاطر راهنمایی ممنونم و خصوصا از davidrobert به خاظر مثال خوبشون... ولی یه کم سخت بود

catch (Exception ex)
{
if (!ShowFriendMessage)
LastError = ex.Message;
else
LastError += "اشکال در ارتباط با دیتابیس / با مدیر برنامه تماس حاصل فرمایید / خطا 100";
}

مرسی

davidrobert
پنج شنبه 16 خرداد 1392, 16:37 عصر
برادر این دستور که دیدید catch (Exception ex)
{
if (!ShowFriendMessage)
LastError = ex.Message;
else
LastError += "اشکال در ارتباط با دیتابیس / با مدیر برنامه تماس حاصل فرمایید / خطا 100";
}


که من از مقدار LastError += استفاده کردم من یه متغییر تعریف کردمدر کلاس DataAccess به نام
public static bool ShowFriendMessage = false;
که اگه مقدار برابر با false بود !ShowFriendMessage
مقدار پیغام اول رو نشان بده یعنی اشکال اصلی رو ولی اگه مقدار true بود در کلاس پیغام فارسی رو نشان بده دیگه این طوری لازم نیست هی دستورات رو عوض کنیم یه متغییر سراری تعریف مکنیم در کلاس و هی صداش میزنیم و با نوشتن مقدار خطا یعنی خطا 100 مربوط به دیتابیس هستش وقتی طرف تماس میگیر و میگه برنامه ایراد داره میگید کد چند میگه 100 میفهمید کدام فرم ایراد رو ایجاد کرده و میرید همان فرم رو میبینید و اشکالیش رو بر طرف میکنید.و با عوض کردن مقدار true یا false مقدار رو فارسی یا انگلیسی میکنید این دستور کلی کلاس من که برای کار با دیتابیس هستش یه با فرامیخونم و هزار بار صداش میزنیم و هی دستور وصل شدن به دیتابیس رو نمی نویسم.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using System.Data.SqlClient;

namespace Bername_Hesabdare_SayeBan_Poshak
{
class DataAccess
{
public static bool ShowFriendMessage = false;
public static string Server = "";
public static string DataBase = "";
public static string UserName = "";
public static string Password = "";
public static bool isExpress = true;
public static DataTable dt;
public SqlConnection con;
public SqlCommand cmd;
public SqlDataAdapter da;
public SqlCommandBuilder cb;

public string LastError = "";


public DataAccess()
{
con = new SqlConnection();
cmd = new SqlCommand();
da = new SqlDataAdapter();
cb = new SqlCommandBuilder();
dt = new DataTable();
cmd.Connection = con;
da.SelectCommand = cmd;

}


public void Connect()
{
try
{
string cs = "";
if (isExpress)
{
cs = @"Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirector y|\DBHesabDarePoshakSayeBan.mdf;Integrated Security=True;User Instance=True";
}
else
{
cs = @"server=" + Server + ";database=" + DataBase + ";trusted_connection=yes;";
//cs = @"server=" + server + ";database=" + database + ";uid=" + user + ";pwd=" + password + ";";
}
con.ConnectionString = cs;
con.Open();
}
catch (Exception ex)
{
if (!ShowFriendMessage)
LastError = ex.Message;
else
LastError += "اشکال در ارتباط با دیتابیس / با مدیر برنامه تماس حاصل فرمایید / خطا 100";
}
}

public void Disconnect()
{
con.Close();
}
public DataTable select(string sql)
{

try
{
cmd.CommandText = sql;
da.Fill(dt);
}
catch (Exception ex)
{
if (!ShowFriendMessage)
LastError = ex.Message;
else
LastError += "خطا در خواندن اطلاعات /خطا 101";
}
return dt;
}
public void DoCommand(string sql)
{
try
{
cmd.CommandText = sql;
cmd.ExecuteNonQuery();
}
catch (Exception ex)
{
if (!ShowFriendMessage)
LastError += ex.Message;
else
LastError += " خطا در اجرا دستورات /خطا 102";
}
}
public string newid(string sql)
{
string AtCnt;
con.Open();
cmd.CommandType = CommandType.Text;
cmd.CommandText = sql;
cmd.Connection = con;
AtCnt = Convert.ToString(cmd.ExecuteScalar());
con.Close();
return AtCnt;
}
public DataTable Search(string CTS)
{
if (con.State != ConnectionState.Open) con.Open();
dt = new DataTable();
cmd = new SqlCommand(CTS, con);
da = new SqlDataAdapter(cmd);
cb = new SqlCommandBuilder(da);
da.Fill(dt);
return (dt);
}

public DataTable I_U_D(string CTS, string CTSIDU)
{
if (con.State != ConnectionState.Open) con.Open();
dt = new DataTable();
cmd = new SqlCommand(CTS, con);
da = new SqlDataAdapter(cmd);
cb = new SqlCommandBuilder(da);
da.Fill(dt);
cmd.CommandText = CTSIDU;
cmd.ExecuteNonQuery();
return (dt);
}
}
}

من خودم تو فرم به این صورت تعریف میکنم برای نمایش خطا
if (db.LastError != "")
MessageBox.Show(db.LastError);
موفق باشید.