خطاهای رایج در بورس


اکنون اگر فایل را ذخیره و صفحه را رفرش کنیم، می‌بینیم که در کنسول مرورگر عبارت مورد نظر ما بازگشت می‌یابد. بدین ترتیب خطای دیگری را اصلاح کرده‌ایم. اکنون می‌توانید خط ()console.log را حذف کنید و یا برای ارجاع در موارد آتی آن را حفظ کنید.

انواع خطاها در جاوا اسکریپت

در این بخش ابتدا به معرفی انواع خطاها و شرایط وقوع آنها می‌پردازیم. سپس با چند مثال به بررسی برخی اشتباهات مرسوم در برنامه‌نویسی می‌پردازیم. این مثال‌ها نشان می‌دهند که برخی روش‌ها در برنامه‌نویسی ممکن است ابتدا بدون اشکال به نظر آیند، اما دارای اشکالاتی هستند و می‌توانند منجر به وقوع خطا شوند.

خطاهای دستوری (Syntax Errors)

یکی از انواع خطاهای رایج در تمام زبان‌های برنامه‌نویسی، خطاهای دستوری هستند. این نوع خطاها زمانی رخ می‌دهند که یکی از دستورات، با قواعد زبان جاوا اسکریپت ناسازگار باشد. معمولاً کشف این موارد بسیار ساده است. زیرا برنامه‌هایی که دارای چنین اشکالاتی باشند، قابل اجرا نیستند. یعنی به محض اینکه مفسر جاوا اسکریپت با چنین دستوراتی مواجه می‌شود، اجرای برنامه را متوقف می‌کند. به عنوان مثال به دستورات زیر توجه کنید. در خط دوم از این دستورات یک اشکال دستوری وجود دارد. یعنی دستور موجود در خط دوم قابل تفسیر توسط مفسر جاوا اسکریپت نیست و یک دستور نامعتبر است.

اما همانطور که پیشتر اشاره شد، مرورگرها در هنگام وقوع خطاها هیچ پیامی را به کاربر نمایش نمی‌دهند. بنابراین کاربر متوجه وقوع خطا نخواهد شد. برای مشاهده‌ی خطاهای رخ داده در یک برنامه‌ی جاوا اسکریپت می‌توان از بخش Console از ابزار Developer Tools استفاده کرد. شکل زیر وضعیت کنسول را در مرورگر Chrome، پس از اجرای دستورات فوق نشان می‌دهد.

console-syntax-error

مشاهده می‌کنید که مرورگر پیام "Uncaught SyntaxError: Unexpected identifier" را در کنسول نمایش می‌دهد. این پیام نشان‌دهنده‌ی وقوع یک خطا از نوع دستوری یا Syntax Error است. همچنین در مقابل این پیام، نام فایل و شماره‌ی خطی که خطا در آن رخ داده است نیز نشان داده می‌شود. با کلیک کردن بر روی نام فایل می‌توانید محل دقیق وقوع خطا را مشاهده کنید. البته پیامی که مشاهده می‌کنید در مرورگرهای مختلف کمی متفاوت است. اما نحوه‌ی برخورد با خطا در تمام مرورگرهای یکسان است.

یکی دیگر از حالاتی که منجر به وقوع یک خطای دستوری می‌شود، تعریف دو شناسه‌ی همنام در یک حوزه است. به عنوان مثال دستورات زیر منجر به وقوع یک خطای دستوری می‌شوند. (پیام خطا در خط سوم نمایش داده شده است.)

توجه کنید که شناسه‌های همنام می‌توانند از هر نوعی باشند. به عنوان مثال اگر متغیری به نام "a" در برنامه تعریف شده باشد، تعریف یک تابع با نام "a" در همان حوزه موجب بروز یک خطای دستوری می‌شود. دستورات زیر این حالت را نشان می‌دهند.

خطاهای ارجاع (Reference Errors)

خطاهای ارجاع یا Reference Errors نوع دیگری از خطاها هستند. این نوع خطاها معمولاً زمانی رخ می‌دهند که قصد استفاده از یک شناسه‌ی تعریف نشده را داشته باشیم. مثلاً فراخوانی تابعی که وجود ندارد و یا استفاده از متغیری که تعریف نشده است. دستور زیر با فرض تعریف نشده بودن تابع a موجب وقوع یک خطای ارجاع و توقف برنامه می‌شود.

همچنین در حالت Strict mode مقداردهی به متغیرهای تعریف نشده نیز موجب بروز یک خطای ارجاع می‌شود. در بخش قبل دیدیم که در حالت عادی می‌توان متغیرهای تعریف نشده را نیز مقداردهی کرد. که در این صورت یک متغیر سراسری جدید تعریف می‌شود. اما در حالت Strict mode این امکان وجود ندارد و انجام این کار موجب بروز یک خطای ارجاع می‌شود. دستورات زیر رفتار جاوا اسکریپت را در این حالت نشان می‌دهند.

خطاهای محدوده (Range Errors)

در برخی دستورات که با اعداد سر و کار دارند، فقط محدوده‌ی مشخصی از اعداد معتبر هستند و نباید از اعداد خارج از این محدوده استفاده شود. در چنین شرایطی، در صورت استفاده از اعداد خارج از محدوده، یک خطای محدوده یا Range Error رخ می‌دهد. به عنوان مثال طول آرایه‌ها حتماً باید یک عدد صحیح بین صفر تا ۴۲۹۴۹۶۷۲۹۵ باشد. در صورتی که از یک عدد اعشاری و یا عدد منفی به عنوان طول آرایه استفاده شود، یک خطای محدود رخ می‌دهد. دستور زیر چنین خطایی تولید می‌کند.

لازم به ذکر است که در صورتی که تابع Array فقط یک آرگومان ورودی داشته باشد و آرگومان ورودی از نوع عددی باشد، مقدار این آرگومان به عنوان طول آرایه‌ی جدید در نظر گرفته می‌شود. به همین دلیل دستور فوق منجر به تولید خطای محدوده می‌شود. زیرا طول آرایه نمی‌تواند منفی باشد.

خطاهای نوع (Type Errors)

خطاهای نوع یا Type Errors معمولاً در دو حالت رخ می‌دهند. حالت اول زمانی است که نوع داده‌ی به کار برده شده برای یک منظور خاص نامناسب باشد. مثلاً به جای ارسال آرگومان عددی به یک تابع خاص، یک رشته را ارسال کنیم. حالت دوم نیز زمانی رخ می‌دهد که متدی را فراخوانی کنیم که تعریف نشده است. توجه کنید که فراخوانی یک تابع تعریف نشده، خطای ارجاع تولید می‌کند. اما فراخوانی یک متد تعریف نشده، خطای نوع تولید می‌کند. به عنوان مثال دستور زیر یک خطای نوع تولید می‌کند. زیرا شئ Math متدی به نام int ندارد.

خطاهای منطقی (Logical Errors)

خطاهای منطقی یا Logical Errors با تمام انواع قبلی خطاها متفاوت هستند. زیرا این نوع خطاها موجب توقف برنامه نمی‌شوند و به همین دلیل کشف این نوع خطاها بر خلاف خطاهای قبلی معمولاً کار ساده‌ای نیست. در واقع مفسر جاوا اسکریپت به هیچ وجه متوجه وقوع خطاهای منطقی نمی‌شود. به همین دلیل هیچ خطایی نیز تولید نشده و برنامه نیز متوقف نمی‌شود. این نوع خطاها معمولاً منجر به تولید خروجی نادرست می‌شوند.

در واقع مهمترین هنر یک برنامه‌نویس در اشکال‌زدایی برنامه‌ها، هنر او در کشف خطاهای منطقی است. زیرا این نوع خطاها هیچ ارتباطی با قواعد زبان برنامه‌نویسی ندارند. بلکه به دلیل استفاده‌ی نادرست از قابلیت‌های زبان برنامه‌نویسی و یا پیاده‌سازی نادرست الگوریتم‌ها توسط برنامه‌نویس رخ می‌دهند. برای نشان دادن مفهوم خطاهای منطقی ابتدا با یک مثال بسیار ساده شروع می‌کنیم.

فرض کنید قصد داریم برنامه‌ای بنویسیم که یک عدد را از کاربر دریافت کرده و در متغیر x قرار دهد. سپس مقدار y را با رابطه‌ی "y = 3x 2 + 2x - 10" محاسبه کرده و به کاربر نمایش دهد. فرض کنید دستورات زیر را برای حل این مسئله نوشته‌ایم.

حال برنامه را اجرا کرده و عدد ۵ را وارد می‌کنیم. طبق رابطه‌ی "y = 3x 2 + 2x - 10" ، نتیجه باید برابر با ۷۵ باشد. اما این برنامه مقدار ۹۷ را به عنوان خروجی نمایش می‌دهد. در اینجا یک خطای منطقی رخ داده است. زیرا برنامه با هیچ خطایی مواجه نشده و کار خود را به طور کامل انجام داده است. اما نتیجه‌ی اجرای برنامه با آنچه انتظار می‌رود متفاوت است. آیا متوجه دلیل نادرست بودن نتیجه شده‌اید؟ مشکل این برنامه در خط دوم آن است. زیر برای محاسبه‌ی 2x، به جای عبارت "2 * x" از "2 ** x" استفاده شده است.

حال سوال این است که آیا راهی وجود دارد تا مفسر جاوا اسکریپت چنین خطایی را تشخیص دهد؟ متاسفانه پاسخ این سوال منفی است. زیرا مفسر نمی‌داند مقصود شما از نوشتن این برنامه چیست و این به عهده‌ی برنامه‌نویس است که الگوریتم حل مسئله را صحیح پیاده‌سازی کند. معمولاً برنامه‌نویسان برای اطمینان از صحت عملکرد برنامه و کشف خطاهای منطقی احتمالی، برنامه را با چند ورودی خاص که خروجی صحیح آن معلوم است آزمایش می‌کنند. مثلاً در همین مثال می‌دانیم که این رابطه به ازای ورودی ۵ باید خروجی ۷۵ را تولید کند. اما با دیدن مقدار ۹۷ در خروجی، متوجه وجود یک خطای منطقی در برنامه می‌شویم.

خطاهای منطقی انواع مختلفی دارند و معمولاً برنامه‌نویس‌ها در اشکال‌زدایی برنامه‌ها، بیشترین زمان را به رفع این نوع خطاها اختصاص می‌دهند.

انواع اشکالات مرسوم در برنامه‌ها و نحوه‌ی رفع آنها

در ادامه به بررسی نمونه‌هایی از اشکالات مرسوم در برنامه‌نویسی که منجر به بروز انواع خطاها (معمولاً خطاهای منطقی) می‌شوند می‌پردازیم. توجه کنید که همین اشکالات خطاهای رایج در بورس به ظاهر ساده‌ای که در این مثال‌ها می‌بینید، ممکن است در برنامه‌های بزرگ ساعت‌ها یک برنامه‌نویس را برای اشکال‌زدایی مشغول کنند. حتی ممکن است برنامه‌نویسان متوجه وجود این اشکالات نشوند و کاربران نهایی آنها را کشف کنند. پس هرچه در زمان پیاده‌سازی توجه بیشتری به این نکات داشته باشید، در آینده با مشکلات کمتری مواجه خواهید شد.

به عنوان اولین مثال برنامه‌ی زیر را در نظر بگیرید. این برنامه ابتدا نام کاربری را با استفاده از متد prompt از کاربر دریافت می‌کند و در متغیر username ذخیره می‌کند. سپس مقدار این متغیر را با رشته‌ی "admin" مقایسه می‌کند و پیام مناسبی را به کاربر نمایش می‌دهد.

این برنامه را می‌توانید اینجا اجرا کنید. با اجرای این برنامه مشاهده خواهید کرد که با وارد کردن هر مقدار دلخواهی در دیالوگ prompt، پیام یکسانی نمایش داده می‌شود. یعنی قسمت else به هیچ وجه اجرا نمی‌شود و همیشه قسمت if اجرا می‌شود. آیا متوجه اشکال موجود در این برنامه شده‌اید؟ اشکال این برنامه در خط دوم آن است که به جای عملگر تساوی "==" از عملگر انتساب "=" استفاده شده است. این کار باعث می‌شود تا همیشه مقدار "admin" در متغیر username ذخیره شود. این مقدار نیز از نظر منطقی دارای ارزش true است. در نتیجه همیشه قسمت if اجرا می‌شود و مقدار وارد شده توسط کاربر هیچ تاثیری در روند اجرای برنامه ندارد.

استفاده از عملگر انتساب به جای عملگر تساوی یکی از اشتباهات رایج در برنامه‌نویسی است. همچنین یکی دیگر از اشتباهات رایج در جاوا اسکریپت، استفاده از عملگر تساوی "==" به جای عملگر تساوی صریح "===" است. هرچند در بسیاری موارد نتیجه‌ی این دو عملگر یکسان است. اما به دلیل تبدیل نوع ضمنی در عملگر "=="، در موارد قابل توجهی نیز نتیجه‌ی این دو عملگر یکسان نیست. چند نمونه از مواردی که نتیجه‌ی این دو عملگر یکسان نیست در قطعه کد زیر نشان داده شده است. پس همیشه باید در زمان استفاده از عملگر تساوی، وجود تبدیل نوع ضمنی را در نظر داشته باشید. همچنین این نکته در مورد دو عملگر "=!" و "==!" نیز صادق است.

حال به بررسی یک حالت نسبتاً پیچیده‌تر می‌پردازیم. در برنامه‌ی زیر تابعی به نام concat نوشته شده است. این تابع ۳ پارامتر ورودی دارد. هدف این تابع دریافت ۲ یا ۳ آرگومان ورودی و بازگرداندن رشته‌ی حاصل از الحاق ورودی‌ها می‌باشد. توجه کنید که آرگومان سوم اختیاری بوده و مقدار پیش‌فرض آن رشته‌ی تهی است. به همین دلیل ابتدا دو آرگومان اول بدون بررسی به یکدیگر الحاق می‌شوند. اما در مورد آرگومان سوم ابتدا بررسی می‌شود که آیا مقداری برای این آرگمان ارسال شده است یا خیر؟ در صورتی خطاهای رایج در بورس که مقداری برای این آرگومان ارسال شده باشد، این آرگومان نیز به مقدار نهایی الحاق می‌شود.

حال این تابع را با چند ورودی آزمایش می‌کنیم. به ازای تمام ورودی‌های زیر، این تابع خروجی مناسبی را تولید می‌کند.

همانطور که مشاهده می‌کنید، حتی با وجود استفاده از آرگومان عددی در دستور سوم، این تابع به درستی عمل کرده و نتیجه‌ی مورد انتظار را تولید می‌کند. اما همیشه وضعیت به این خوبی نیست. به عنوان مثال فرض کنید عدد صفر به عنوان آرگومان سوم به این تابع ارسال شود. در این صورت این عدد به رشته‌ی خروجی این تابع الحاق نخواهد شد. دستور زیر رفتار این تابع را در چنین شرایطی نشان می‌دهد.

دلیل بروز این خطای منطقی، استفاده از عملگر عدم تساوی "=!"، به جای عملگر عدم تساوی صریح "==!" است. زیرا عملگر عدم تساوی "=!"، ابتدا عملوندها را به صورت ضمنی به نوع Boolean تبدیل می‌کند. با توجه به اینکه عدد صفر و همچنین رشته‌ی تهی، از نظر منطقی دارای ارزش false هستند. در نتیجه شرط مقابل if برقرار نیست و دستور داخل بلاک if اجرا نمی‌شود. اما عدد یک از نظر منطقی دارای ارزش true است. به همین دلیل دستور اول به درستی اجرا می‌شود.

برای رفع اشکال موجود در این برنامه باید از عملگر عدم تساوی صریح "==!" استفاده شود. پس می‌توان برنامه را به شکل زیر اصلاح کرد. مشاهده می‌کنید که در این حالت خطای منطقی قبل رخ نمی‌دهد.

البته این تابع را به شکل ساده‌‌تری نیز می‌توان نوشت. در این مثال صرفاً برای تشریح اهمیت تمایز قائل شدن بین انواع مختلف عملگرهای مقایسه‌ای و توجه به تبدیلات ضمنی در این نوع عملگرها از ساختار if استفاده شد. اما می‌توان همین تابع را به شکل ساده‌تری به صورت زیر پیاده‌سازی کرد.

البته این تابع هنوز دارای یک مشکل جدی است. فرض کنید هر ۳ آرگومان ورودی این تابع از نوع عددی باشند. در این صورت عملگر "+" به جای الحاق این آرگومان‌ها به یکدیگر، آنها را با یکدیگر جمع می‌کند. دستورات زیر این حالت را نشان می‌دهند.

عدم توجه به نوع داده‌ها، یکی از مهمترین عوامل وقوع خطاهای منطقی در برنامه‌های جاوا اسکریپت است. به طور کلی در زبان‌های برنامه‌نویسی مفسری به دلیل تبدیل ضمنی نوع داده‌ها به یکدیگر، این نوع خطاهای منطقی زیاد رخ می‌دهند. برای پیشگیری از وقوع چنین خطاهایی باید همیشه قبل از استفاده از داده‌ها، نوع آنها بررسی شود و در صورت نیاز تبدیل نوع به صورت صریح انجام شود. به عنوان مثال تابع concat را می‌توان به این صورت بازنویسی کرد.

در این نسخه از تابع concat به دلیل تبدیل صریح str1 به نوع رشته‌ای، حتی در صورت ارسال آرگومان‌های عددی، عملگر "+" قطعاً عمل الحاق را انجام می‌دهد. زیرا حداقل یکی از عملوندها از نوع رشته است. البته این روش در صورتی مناسب است که تبدیل نوع مجاز باشد. در برخی شرایط ممکن است تبدیل نوع مجاز نباشد و ارسال آرگومان‌های عددی یا هر نوعی غیر از نوع رشته، غیر مجاز باشد. در چنین شرایطی باید ابتدا نوع آرگومان‌ها بررسی شود تا در صورت غیر مجاز بودن نوع آرگومان‌های ورودی، با تولید یک خطای سفارشی اجرای برنامه متوقف شود. (در مورد تولید خطاهای سفارشی در بخش بعدی صحبت خواهیم کرد.)

به عنوان آخرین مثال و برای نشان دادن حالتی که در آن تبدیل نوع مجاز نیست به مثال زیر توجه کنید. لازم به ذکر است که مجاز بودن یا نبودن تبدیل نوع، توسط برنامه‌نویس و منطق برنامه تعیین می‌شود. در این مثال تابعی به نام getQueryString وجود دارد که یک آدرس URL را دریافت کرده و مقدار Query String موجود در آدرس را بازمی‌گرداند. در این تابع برای یافتن Query String، ابتدا موقعیت (یا اندیس) کاراکتر علامت سوال با استفاده از متد indexOf به دست می‌آید. سپس با استفاده از متد substring، بخشی از رشته که بعد از این موقعیت قرار دارد به عنوان نتیجه بازگردانده می‌شود. همچنین اگر آدرس وارد شده دارای کاراکتر علامت سوال نباشد، مقدار تهی به عنوان نتیجه بازگردانده می‌شود.

این برنامه نیز در ظاهر مشکل خاصی ندارد و برای ورودی‌های معتبر مانند ورودی‌های زیر، خروجی‌های معتبر تولید می‌کند.

اما ممکن است ورودی این تابع یک رشته نباشد. مثلاً اگر یک عدد به عنوان آرگومان ورودی به این تابع ارسال شود. با توجه به اینکه متغیرهای عددی متدی به نام indexOf ندارند، یک خطای نوع ایجاد شده و برنامه متوقف می‌شود. دستور زیر چنین حالتی را نشان می‌دهد.

در چنین شرایطی بهتر است ابتدا نوع آرگومان ورودی بررسی شود و در صورت نامعتبر بودن نوع داده، یک خطای سفارشی تولید شود. در بخش بعد در مورد این موضوع بیشتر صحبت خواهیم کرد.

مقاله نشریه
ارتباط بین خطاهای ادراکی در تصمیم گیری و شخصیت

چکیده:
زمينه و هدف: اين پژوهش با هدف بررسي روابط بين پنج ويژگي شخصيتي با خطاهاي ادراكي در تصميم گيري، در بين سرمايه گذاران تالار بورس اصفهان انجام گرفت.
مواد و روش ها : پژوهش حاضر كاربردي از نوع توصيفي و همبستگي است. جامعه آماري پژوهش شامل كليه سرمايه گذاران، كارشناسان و متخصصان موسسات سرمايه گذاري، موسسات تامين سرمايه، صندوق هاي مشترك سرمايه گذاري، كارگزاران بورس اوراق بهادار فعال در تالار بورس اصفهان در فاصله زماني شش ماهه دوم سال 1392 و سه ماهه اول سال 1393 بود. تعداد 120 نفر نمونه محاسبه شد. نمونه گيري به روش تصادفي در دسترس انجام گرفت. براي جمع آوري داده ها از پرسش نامه شخصيتي پنج عاملي NEOPI-FF فرم كوتاه و پرسش نامه محقق ساخته كه شامل 32 گويه مي باشد، استفاده شد. رواﻳﻲ پرسش نامه ها ﻫﻢ از نظر ﻣﺤﺘﻮايي (از طريق كارشناسان و متخصصان) مورد تاييد قرار گرفت. ﺑـﺮاي ﺗﻌﻴـﻴﻦ ﭘﺎﻳـﺎﻳﻲ از روش آﻟﻔـﺎي ﻛﺮوﻧﺒـﺎخ اﺳــﺘﻔﺎده ﺷــﺪ. تجزيه و تحليل داده هاي تحقيق در دو سطح آمار توصيفي و استنباطي در سطح اطمينان 95 درصد (همبستگي پيرسون، تحليل رگرسيون، آزمون آناليز واريانس يك طرفه (ANOVA)، Kolmogorov–Smirnov) انجام گرفت.
يافته ها: در سطح اطمينان 95 درصد بين روان رنجوري و خطاي هاله اي رابطه معني داري و معكوس، بين برون گرايي و خطاي كليشه اي رابطه معني داري و مثبت، بين وظيفه شناسي و خطاي شانس رابطه معني دار و مستقيم، و بين گشودگي و خطاي شانس رابطه معني دار و معكوس وجود دارد. بين خطاهاي ادراكي و تيپ شخصيتي سازگاري، ارتباط معني داري به دست نيامد. از بين تيپ هاي شخصيتي تنها برونگرايي و وظيفه شناسي توانستند خطاي ادراكي كليشه اي را پيش بيني كنند و ديگر خطاها از طريق تيپ هاي شخصيتي قابل پيش بيني نبودند.
نتيجه گيري: نتايج بدست آمده بيانگر آن است كه هر چه تيپ شخصيتي افراد وظيفه شناس تر باشد، ميزان بروز خطاهاي ادراكي هاله اي و تصادفي در آنها بيشتر خواهد بود. بر اساس نتايج جدول 1، نتايج زير بدست آمد: (وظيفه شناسي) 25/0 + (برونگرايي) 47/0 = خطاي كليشه اي و (وظيفه شناسي) 25/0 + (گشودگي) 15/ - (برونگرايي) 57/0 = خطاي هاله اي.

کليدواژگان: شخصيت، خطاهاي ادراكي، بازار بورس، تصميم گيري، پنج عاملي شخصيت

خطاهای رایج در بورس

FAQ - وابستگان تجاری, عمومی, شروع, واریزها و برداشت ها, همه چیز درباره معاملات, سرمایه‌گذاری FXTM, برنامه های همکاری | FXTM Global

افزایش شاخص بورس تهران / معاملات بورس و فرابورس 24 هزار .

امروز معامله گران در بورس تهران بیش از 15.3 میلیارد سهام، حق تقدم و اوراق مالی در قالب 1.8 میلیون نوبت معامله و به ارزش 18 هزار و 135 میلیارد تومان داد و ستد کردند.

تفاوت حزب جمهوری خواه با دموکرات در آمریکا | انگیزه

از جمله تفاوت جمهوری خواه با دموکرات می‌توان به مواضع متفاوت در برابر ازدواج هم‌جنس‌گرایان، برخورد با مهاجران غیرقانونی، افزایش مالیات و . اشاره کرد.

خطاهای رایج | FXTM Global

FAQ - خطاهای رایج, عمومی, شروع, واریزها و برداشت ها, همه چیز درباره معاملات, سرمایه‌گذاری FXTM, برنامه های همکاری | FXTM Global

ریزش ۲۸ هزار واحدی شاخص در اولین روز هفته

خبرگزاری میزان - شاخص بورس و اوراق بهادار تهران در معاملات ۱۷ آبان ماه ۹۹ با اُفت بیش از ۲۸ هزار و ۹۳ واحدی به پله یک میلیون و ۲۶۲ هزار واحدی رسید. در معاملات امروز تعداد ۴۳۱ هزار سهم اوراق بهادار به ارزش ۳۹ هزار و ۴۳۸ .

رقم واقعی طلب شهرداری از دولت مشخص شد | هزینه‌های اداره .

به گزارش همشهری آنلاین، محمدجواد حق‌شناس در دویست و پنجاه و یکمین جلسه شورای اسلامی شهر تهران با طرح این پرسش که هزینه‌های عظیم و پنهان پایتختی شهر تهران چه زمانی قرار است محاسبه شود و در صورتحساب مطالبات مدیریت شهری .

عرضه عمومی جایگزین - ویکی‌پدیا، دانشنامهٔ آزاد

عرضهٔ عمومی جایگزین (انگلیسی: Alternative Public Offering) ترکیبی است از ادغام معکوس و عرضهٔ خصوصی در بورس که هم‌زمان باهم انجام می‌شوند.شرکت‌ها می‌توانند عرضهٔ عمومی جایگزین را به جای عرضهٔ عمومی اولیه در جهت عرضهٔ عمومی برای .

سومین روز سبزپوشی بازار سرمایه/ حرکت آرام به سمت سد مقاومتی

عمومی ; . و فرابورس ایران در مجموع بیش از ۱۲ هزار و ۹۰۳ میلیارد تومان داد و ستد کردند که نشان‌دهند روند رو به رشد ارزش معاملات و رسیدن بازار و اکثر سهام به ارزش واقعی است.

فرارو | (تصاویر) نخستین حضور ترامپ در انظار عمومی پس از .

بیش از ۲۹۰۰۰۰ نفر از مشاهیر، رؤسای جمهور و باصطلاح قهرمانان تمامی جنگ‌های آمریکا (همچون جان فاستر دالس، لی ماروین، جورج مارشال و ادمیرال پورتر) در این مکان دفن هستند.

افزایش شاخص بورس تهران / ارزش معاملات بورس و فرابورس 18.9 .

شاخص کل بورس اوراق بهادار تهران امروز در پایان معاملات با افزایش 19 هزار و 730 واحد روبه‌رو شد و ارزش معاملات بورس و فرابورس به بیش از 18.9 هزار میلیارد تومان رسید.

تغییرات شرکت و پلمپ دفاتر قانونی شرکت ها - تابناک | TABNAK

Dec 10, 2020· و در نهایت برای هر نوع تغییری در شرکت صورتجلسه ای تنظیم می شود و به اداره ثبت شرکت ها ارسال می شود. صورتجلسات تغییرات شرکت ها شامل موارد زیر هستند. صورتجلسه مجمع عمومی موسسین

قیمت سکه، طلا و ارز ۹۹.۰۹.۱۸ - خبرآنلاین

Dec 08, 2020· هر دلار آمریکا در صرافی های رسمی بدون تغییر نسبت به نخستین ساعات معاملات همچنین به قیمت ۲۵ هزار و ۶۰۰ تومان و هر یورو نیز ۳۱ هزار تومان داد و ستد می شود.

بورس تهران برای یک رشد قابل قبول آماده است

Dec 04, 2020· سلامت عمومی; . تعیل بود و با داد و ستد‌ها در حداقل قرار داشت البته به طور کلی داد و ستد در کشور جریان داشت و خیلی از شهر‌های در وضعیت نارنجی و سفید بودند که در این شهر‌ها معاملات انجام می‌شد .

آموزش آشنایی با الزامات صدور چک | رایگان

اهمیت و نقش چک به عنوان ساده‌ترین وسیله پرداخت، در تنظیم روابط و اعمال حقوقی و داد و ستد در بین مردم بسیار واضح است، چون همه ما روزانه شاهد و ناظر به گردش درآمدن تعداد بی‌شماری از این برگ‌ها .

تعریف تخفیف و انواع آن؛ ثبت تخفیف در نرم افزار سپیدار .

در این مقاله ابتدا به تعریف تخفیف و انواع تخفیف پرداخته ایم و ثبت تخفیف در نرم افزار سپیدار را با تصویر آموزش داده ایم. + مشاهده امکانات نرم افزار سپیدار

کتاب زندگی از راه داد و ستد در بازارهای مالی – نشر چالش

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

مفید کالا - emofid

از آن جایی که بورس های کالا به عنوان نهادهایی سازمان یافته جهت داد و ستد قانونمند و نیز توسعه بازار سرمایه و بخش های مختلف اقتصادی به شمار می روند، لذا نتایج عملکرد آنها می تواند تاثیرات بسیار .

شاخص بورس تهران کاهش یافت

شاخص کل بورس اوراق بهادار تهران امروز پس از نوسان فراوان با کاهش 2679 واحد روبه‌رو شد، در حالی که ارزش معاملات بورس و فرابورس به بیش از 31 هزار و 299 میلیارد تومان رسید.

چگونه با ۳۵ میلیون تومان وام ۲۴۰ میلیونی بگیریم؟

قیمت هر برگ از اوراق تسهیلات مسکن به طور متوسط در هفته های گذشته کاهشی بوده و در آبان ماه سال جاری به ۷۳ هزار تومان رسیده است. بر این اساس، زوجین تهرانی برای تهیه وام ۲۴۰ میلیونی مسکن و جعاله باید حدود ۳۵ میلیون تومان .

تکنیکال، خطاهای رایج در بورس بنیادی و پیش‌بینی سهم «گدنا» : توزیع غذای فدک

اگر در روز شنبه، بیش از ۸ میلیون و ۳۳۳ هزار سهم گدنا مورد معامله قرار بگیرد، ۶۳۰ تومان، معیار دامنه نوسان روز بعد است و میشود انتظار داشت که روز یکشنبه، هر سهم گدنا بیش از ۶۶۰ تومان داد و ستد شود.

تقلب در بازار لوازم خانگی با خرید کارتن خالی میلیونی .

کلاهبرداری شیاد‌هایی هرچند کم تعداد، باعث می‌شود اعتماد عمومی در این صنف و جامعه کاهش پیدا کند. مشکلاتی که نیاز به پیگیری و گزارش به موقع و دقیق مسئولان نظارتی، و برخورد قاطع با آن‌ها دارد .

تفاوت سبک نوشتاری ادبی و علمی! | موج احساس

هستی ثاقب - مجلۀ ایرسا در یکی از جلسه‌های درسی مضمون فارسی دری استاد از من خواست تا در رابطه به این‌که چرا به سبک ادبی می‌نویسیم، استدلال منطقی و عقلانی بیاورم. راستش برای من که به ویژه در حوز‌ه‌ی ادبیات زبان پُربار .

ترازوهای غیرقانونی از چرخه داد و ستد عمومی تهران خارج می .

تهران-ایرنا -اداره‌کل استاندارد استان تهران اعلام کرد: وسایل سنجش و توزین غیرقانونی از چرخه داد و ستد عمومی تهران خارج می شوند.

قیمت اوراق مسکن کاهش یافت

Dec 09, 2020· قیمت اوراق مسکن نسبت به حدود دو هفته پیش روند کاهشی داشته و طبق آخرین قیمت، متاهل های تهرانی برای این اوراق باید ۲۸ میلیون و ۹۴۴ هزار تومان پرداخت کنند؛ درحالی که این رقم در دو هفته قبل حدود ۳۵ میلیون تومان بود.

انواع خطاها در جاوا اسکریپت

در این بخش ابتدا به معرفی انواع خطاها و شرایط وقوع آنها می‌پردازیم. سپس با چند مثال به بررسی برخی اشتباهات مرسوم در برنامه‌نویسی می‌پردازیم. این مثال‌ها نشان می‌دهند که برخی روش‌ها در برنامه‌نویسی ممکن است ابتدا بدون اشکال به نظر آیند، اما دارای اشکالاتی هستند و می‌توانند منجر به وقوع خطا شوند.

خطاهای دستوری (Syntax Errors)

یکی از انواع خطاهای رایج در تمام زبان‌های برنامه‌نویسی، خطاهای دستوری هستند. این نوع خطاها زمانی رخ می‌دهند که یکی از دستورات، با قواعد زبان جاوا اسکریپت ناسازگار باشد. معمولاً کشف این موارد بسیار ساده است. زیرا برنامه‌هایی که دارای چنین اشکالاتی باشند، قابل اجرا نیستند. یعنی به محض اینکه مفسر جاوا اسکریپت با چنین دستوراتی مواجه می‌شود، اجرای برنامه را متوقف می‌کند. به عنوان مثال به دستورات زیر توجه کنید. در خط دوم از این دستورات یک اشکال دستوری وجود دارد. یعنی دستور موجود در خط دوم قابل تفسیر توسط مفسر جاوا اسکریپت نیست و یک دستور نامعتبر است.

اما همانطور که پیشتر اشاره شد، مرورگرها در هنگام وقوع خطاها هیچ پیامی را به کاربر نمایش نمی‌دهند. بنابراین کاربر متوجه وقوع خطا نخواهد شد. برای مشاهده‌ی خطاهای رخ داده در یک برنامه‌ی جاوا اسکریپت می‌توان از بخش Console از ابزار Developer Tools استفاده کرد. شکل زیر وضعیت کنسول را در مرورگر Chrome، پس از اجرای دستورات فوق نشان می‌دهد.

console-syntax-error

مشاهده می‌کنید که مرورگر پیام "Uncaught SyntaxError: Unexpected identifier" را در کنسول نمایش می‌دهد. این پیام نشان‌دهنده‌ی وقوع یک خطا از نوع دستوری یا Syntax Error است. همچنین در مقابل این پیام، نام فایل و شماره‌ی خطی که خطا در آن رخ داده است نیز نشان داده می‌شود. با کلیک کردن بر روی نام فایل می‌توانید محل دقیق وقوع خطا خطاهای رایج در بورس را مشاهده کنید. البته پیامی که مشاهده می‌کنید در مرورگرهای مختلف کمی متفاوت است. اما نحوه‌ی برخورد با خطا در تمام مرورگرهای یکسان است.

یکی دیگر از حالاتی که منجر به وقوع یک خطای دستوری می‌شود، تعریف دو شناسه‌ی همنام در یک حوزه است. به عنوان مثال دستورات زیر منجر به وقوع یک خطای دستوری می‌شوند. (پیام خطا در خط سوم نمایش داده شده است.)

توجه کنید که شناسه‌های همنام می‌توانند از هر نوعی باشند. به عنوان مثال اگر متغیری به نام "a" در برنامه تعریف شده باشد، تعریف یک تابع با نام "a" در همان حوزه موجب بروز یک خطای دستوری می‌شود. دستورات زیر این حالت را نشان می‌دهند.

خطاهای ارجاع (Reference Errors)

خطاهای ارجاع یا Reference Errors نوع دیگری از خطاها هستند. این نوع خطاها معمولاً زمانی رخ می‌دهند که قصد استفاده از یک شناسه‌ی تعریف نشده را داشته باشیم. مثلاً فراخوانی تابعی که وجود ندارد و یا استفاده از متغیری که تعریف نشده است. دستور زیر با فرض تعریف نشده بودن تابع a موجب وقوع یک خطای ارجاع و توقف برنامه می‌شود.

همچنین در حالت Strict mode مقداردهی به متغیرهای تعریف نشده نیز موجب بروز یک خطای ارجاع می‌شود. در بخش قبل دیدیم که در حالت عادی می‌توان متغیرهای تعریف نشده را نیز مقداردهی کرد. که در این صورت یک متغیر سراسری جدید تعریف می‌شود. اما در حالت Strict mode این امکان وجود ندارد و انجام این کار موجب بروز یک خطای ارجاع می‌شود. دستورات زیر رفتار جاوا اسکریپت را در این حالت نشان می‌دهند.

خطاهای محدوده (Range Errors)

در برخی دستورات که با اعداد سر و کار دارند، فقط محدوده‌ی مشخصی از اعداد معتبر هستند و نباید از اعداد خارج از این محدوده استفاده شود. در چنین شرایطی، در صورت استفاده از اعداد خارج از محدوده، یک خطای محدوده یا Range Error رخ می‌دهد. به عنوان مثال طول آرایه‌ها حتماً باید یک عدد صحیح بین صفر تا ۴۲۹۴۹۶۷۲۹۵ باشد. در صورتی که از یک عدد اعشاری و یا عدد منفی به عنوان طول آرایه استفاده شود، یک خطای محدود رخ می‌دهد. دستور زیر چنین خطایی تولید می‌کند.

لازم به ذکر است که در صورتی که تابع Array فقط یک آرگومان ورودی داشته باشد و آرگومان ورودی از نوع عددی باشد، مقدار این آرگومان به عنوان طول آرایه‌ی جدید در نظر گرفته می‌شود. به همین دلیل دستور فوق منجر به تولید خطای محدوده می‌شود. زیرا طول آرایه نمی‌تواند منفی باشد.

خطاهای نوع (Type Errors)

خطاهای نوع یا Type Errors معمولاً در دو حالت رخ می‌دهند. حالت اول زمانی است که نوع داده‌ی به کار برده شده برای یک منظور خاص نامناسب باشد. مثلاً به جای ارسال آرگومان عددی به یک تابع خاص، یک رشته را ارسال کنیم. حالت دوم نیز زمانی رخ می‌دهد که متدی را فراخوانی کنیم که تعریف نشده است. توجه کنید که فراخوانی یک تابع تعریف نشده، خطای ارجاع تولید می‌کند. اما فراخوانی یک متد تعریف نشده، خطای نوع تولید می‌کند. به عنوان مثال دستور زیر یک خطای نوع تولید می‌کند. زیرا شئ Math متدی به نام int ندارد.

خطاهای منطقی (Logical Errors)

خطاهای منطقی یا Logical Errors با تمام انواع قبلی خطاها متفاوت هستند. زیرا این نوع خطاها موجب توقف برنامه نمی‌شوند و به همین دلیل کشف این نوع خطاها بر خلاف خطاهای قبلی معمولاً کار ساده‌ای نیست. در واقع مفسر جاوا اسکریپت به هیچ وجه متوجه وقوع خطاهای منطقی نمی‌شود. به همین دلیل هیچ خطایی نیز تولید نشده و برنامه نیز متوقف نمی‌شود. این نوع خطاها معمولاً منجر به تولید خروجی نادرست می‌شوند.

در واقع مهمترین هنر یک برنامه‌نویس در اشکال‌زدایی برنامه‌ها، هنر او در کشف خطاهای منطقی است. زیرا این نوع خطاها هیچ ارتباطی با قواعد زبان برنامه‌نویسی ندارند. بلکه به دلیل استفاده‌ی نادرست از قابلیت‌های زبان برنامه‌نویسی و یا پیاده‌سازی نادرست الگوریتم‌ها توسط برنامه‌نویس رخ می‌دهند. برای نشان دادن مفهوم خطاهای منطقی ابتدا با یک مثال بسیار ساده شروع می‌کنیم.

فرض کنید قصد داریم برنامه‌ای بنویسیم که یک عدد را از کاربر دریافت کرده و در متغیر x قرار دهد. سپس مقدار y را با رابطه‌ی "y = 3x 2 + 2x - 10" محاسبه کرده و به کاربر نمایش دهد. فرض کنید دستورات زیر را برای حل این مسئله نوشته‌ایم.

حال برنامه را اجرا کرده و عدد ۵ را وارد می‌کنیم. طبق رابطه‌ی "y = 3x 2 + 2x - 10" ، نتیجه باید برابر با ۷۵ باشد. اما این برنامه مقدار ۹۷ را به عنوان خروجی نمایش می‌دهد. در اینجا یک خطای منطقی رخ داده است. زیرا برنامه با هیچ خطایی مواجه نشده و کار خود را به طور کامل انجام داده است. اما نتیجه‌ی اجرای برنامه با آنچه انتظار می‌رود متفاوت است. آیا متوجه دلیل نادرست بودن نتیجه شده‌اید؟ مشکل این برنامه در خط خطاهای رایج در بورس دوم آن است. زیر برای محاسبه‌ی 2x، به جای عبارت "2 * x" از "2 ** x" استفاده شده است.

حال سوال این است که آیا راهی وجود دارد تا مفسر جاوا اسکریپت چنین خطایی را تشخیص دهد؟ متاسفانه پاسخ این سوال منفی است. زیرا مفسر نمی‌داند مقصود شما از نوشتن این برنامه چیست و این به عهده‌ی برنامه‌نویس است که الگوریتم حل مسئله را صحیح پیاده‌سازی کند. معمولاً برنامه‌نویسان برای اطمینان از صحت عملکرد برنامه و کشف خطاهای منطقی احتمالی، برنامه را با چند ورودی خاص که خروجی صحیح آن معلوم است آزمایش می‌کنند. مثلاً در همین مثال می‌دانیم که این رابطه به ازای ورودی ۵ باید خروجی ۷۵ را تولید کند. اما با دیدن مقدار ۹۷ در خروجی، متوجه وجود یک خطای منطقی در برنامه می‌شویم.

خطاهای منطقی انواع مختلفی دارند و معمولاً برنامه‌نویس‌ها در اشکال‌زدایی برنامه‌ها، بیشترین زمان را به رفع این نوع خطاها اختصاص می‌دهند.

انواع اشکالات مرسوم در برنامه‌ها و نحوه‌ی رفع آنها

در ادامه به بررسی نمونه‌هایی از اشکالات مرسوم در برنامه‌نویسی که منجر به بروز انواع خطاها (معمولاً خطاهای منطقی) می‌شوند می‌پردازیم. توجه کنید که همین اشکالات به ظاهر ساده‌ای که در این مثال‌ها می‌بینید، ممکن است در برنامه‌های بزرگ ساعت‌ها یک برنامه‌نویس را برای اشکال‌زدایی مشغول کنند. حتی ممکن است برنامه‌نویسان متوجه وجود این اشکالات نشوند و کاربران نهایی آنها را کشف کنند. پس هرچه در زمان پیاده‌سازی توجه بیشتری به این نکات داشته باشید، در آینده با مشکلات کمتری مواجه خواهید شد.

به عنوان اولین مثال برنامه‌ی زیر را در نظر بگیرید. این برنامه ابتدا نام کاربری را با استفاده از متد prompt از کاربر دریافت می‌کند و در متغیر username ذخیره می‌کند. سپس مقدار این متغیر را با رشته‌ی "admin" مقایسه می‌کند و پیام مناسبی را به کاربر نمایش می‌دهد.

این برنامه را می‌توانید اینجا اجرا کنید. با اجرای این برنامه مشاهده خواهید کرد که با وارد کردن هر مقدار دلخواهی در دیالوگ prompt، پیام یکسانی نمایش داده می‌شود. یعنی قسمت else به هیچ وجه اجرا نمی‌شود و همیشه قسمت if اجرا می‌شود. آیا متوجه اشکال موجود در این برنامه شده‌اید؟ اشکال این برنامه در خط دوم آن است که به جای عملگر تساوی "==" از عملگر انتساب "=" استفاده شده است. این کار باعث می‌شود تا همیشه مقدار "admin" در متغیر username ذخیره شود. این مقدار نیز از نظر منطقی دارای ارزش true است. در نتیجه همیشه قسمت if اجرا می‌شود و مقدار وارد شده توسط کاربر هیچ تاثیری در روند اجرای برنامه ندارد.

استفاده از عملگر انتساب به جای عملگر تساوی یکی از اشتباهات رایج در برنامه‌نویسی است. همچنین یکی دیگر از اشتباهات رایج در جاوا اسکریپت، استفاده از عملگر تساوی "==" به جای عملگر تساوی صریح "===" است. هرچند در بسیاری موارد نتیجه‌ی این دو عملگر یکسان است. اما به دلیل تبدیل نوع ضمنی در عملگر "=="، در موارد قابل توجهی نیز نتیجه‌ی این دو عملگر یکسان نیست. چند نمونه از مواردی که نتیجه‌ی این دو عملگر یکسان نیست در قطعه کد زیر نشان داده شده است. پس همیشه باید در زمان استفاده از عملگر تساوی، وجود تبدیل نوع ضمنی را در نظر داشته باشید. همچنین این نکته در مورد دو عملگر "=!" و "==!" نیز صادق است.

حال به بررسی یک حالت نسبتاً پیچیده‌تر می‌پردازیم. در برنامه‌ی زیر تابعی به نام concat نوشته شده است. این تابع ۳ پارامتر ورودی دارد. هدف این تابع دریافت ۲ یا ۳ آرگومان ورودی و بازگرداندن رشته‌ی حاصل از الحاق ورودی‌ها می‌باشد. توجه کنید که آرگومان سوم اختیاری بوده و مقدار پیش‌فرض آن رشته‌ی تهی است. به همین دلیل ابتدا دو آرگومان اول بدون بررسی به یکدیگر الحاق می‌شوند. اما در مورد آرگومان سوم ابتدا بررسی می‌شود که آیا مقداری برای این آرگمان ارسال شده است یا خیر؟ در صورتی که مقداری برای این آرگومان ارسال شده باشد، این آرگومان نیز به مقدار نهایی الحاق می‌شود.

حال این تابع را با چند ورودی آزمایش می‌کنیم. به ازای تمام ورودی‌های زیر، این تابع خروجی مناسبی را تولید می‌کند.

همانطور که مشاهده می‌کنید، حتی با وجود استفاده از آرگومان عددی در دستور سوم، این تابع به درستی عمل کرده و نتیجه‌ی مورد انتظار را تولید می‌کند. اما همیشه وضعیت به این خوبی نیست. به عنوان مثال فرض کنید عدد صفر به عنوان آرگومان سوم به این تابع ارسال شود. در این صورت این عدد به رشته‌ی خروجی این تابع الحاق نخواهد شد. دستور زیر رفتار این تابع را در چنین شرایطی نشان می‌دهد.

دلیل بروز این خطای منطقی، استفاده از عملگر عدم تساوی "=!"، به جای عملگر عدم تساوی صریح "==!" است. زیرا عملگر عدم تساوی "=!"، ابتدا عملوندها را به صورت ضمنی به نوع Boolean تبدیل می‌کند. با توجه به اینکه عدد صفر و همچنین رشته‌ی تهی، از نظر منطقی دارای ارزش false هستند. در نتیجه شرط مقابل if برقرار نیست و دستور داخل بلاک if اجرا نمی‌شود. اما عدد یک از نظر منطقی دارای ارزش true است. به همین دلیل دستور اول به درستی اجرا می‌شود.

برای رفع اشکال موجود در این برنامه باید از عملگر عدم تساوی صریح "==!" استفاده شود. پس می‌توان برنامه را به شکل زیر اصلاح کرد. مشاهده می‌کنید که در این حالت خطای منطقی قبل رخ نمی‌دهد.

البته این تابع را به شکل ساده‌‌تری نیز می‌توان نوشت. در این مثال صرفاً برای تشریح اهمیت تمایز قائل شدن بین انواع مختلف عملگرهای مقایسه‌ای و توجه به تبدیلات ضمنی در این نوع عملگرها از ساختار if استفاده شد. اما می‌توان همین تابع را به شکل ساده‌تری به صورت زیر پیاده‌سازی کرد.

البته این تابع هنوز دارای یک مشکل جدی است. فرض کنید هر ۳ آرگومان ورودی این تابع از نوع عددی باشند. در این صورت عملگر "+" به جای الحاق این آرگومان‌ها به یکدیگر، آنها را با یکدیگر جمع می‌کند. دستورات زیر این حالت را نشان می‌دهند.

عدم توجه به نوع داده‌ها، یکی از مهمترین عوامل وقوع خطاهای منطقی در برنامه‌های جاوا اسکریپت است. به طور کلی در زبان‌های برنامه‌نویسی مفسری به دلیل تبدیل ضمنی نوع داده‌ها به یکدیگر، این نوع خطاهای منطقی زیاد رخ می‌دهند. برای پیشگیری از وقوع چنین خطاهایی باید همیشه قبل از استفاده از داده‌ها، نوع آنها بررسی شود و در صورت نیاز تبدیل نوع به صورت صریح انجام شود. به عنوان مثال تابع concat را می‌توان به این صورت بازنویسی کرد.

در این نسخه از تابع concat به دلیل تبدیل صریح str1 به نوع رشته‌ای، حتی در صورت ارسال آرگومان‌های عددی، عملگر "+" قطعاً عمل الحاق را انجام می‌دهد. زیرا حداقل یکی از عملوندها از نوع رشته است. البته این روش در صورتی مناسب است که تبدیل نوع مجاز باشد. در برخی شرایط ممکن است تبدیل نوع مجاز نباشد و ارسال آرگومان‌های عددی یا هر نوعی غیر از نوع رشته، غیر مجاز باشد. در چنین شرایطی باید ابتدا نوع آرگومان‌ها بررسی شود تا در صورت غیر مجاز بودن نوع آرگومان‌های ورودی، با تولید یک خطای سفارشی اجرای برنامه متوقف شود. (در مورد تولید خطاهای سفارشی در بخش بعدی صحبت خواهیم کرد.)

به عنوان آخرین مثال و برای نشان دادن حالتی که در آن تبدیل نوع مجاز نیست به مثال زیر توجه کنید. لازم به ذکر است که مجاز بودن یا نبودن تبدیل نوع، توسط برنامه‌نویس و منطق برنامه تعیین می‌شود. در این مثال تابعی به نام getQueryString وجود دارد که یک آدرس URL را دریافت کرده و مقدار Query String موجود در آدرس را بازمی‌گرداند. در این تابع برای یافتن Query String، ابتدا موقعیت (یا اندیس) کاراکتر علامت سوال با استفاده از متد indexOf به دست می‌آید. سپس با استفاده از متد substring، بخشی از رشته که بعد از این موقعیت قرار دارد به عنوان نتیجه بازگردانده می‌شود. همچنین اگر آدرس وارد شده دارای کاراکتر علامت سوال نباشد، مقدار تهی به عنوان نتیجه بازگردانده می‌شود.

این برنامه نیز در ظاهر مشکل خاصی ندارد و برای ورودی‌های معتبر مانند ورودی‌های زیر، خروجی‌های معتبر تولید می‌کند.

اما ممکن است ورودی این تابع یک رشته نباشد. مثلاً اگر یک عدد به عنوان آرگومان ورودی به این تابع ارسال شود. با توجه به اینکه متغیرهای عددی متدی به نام indexOf ندارند، یک خطای نوع ایجاد شده و برنامه متوقف می‌شود. دستور زیر چنین حالتی را نشان می‌دهد.

در چنین شرایطی بهتر است ابتدا نوع آرگومان ورودی بررسی شود و در صورت نامعتبر بودن نوع داده، یک خطای سفارشی تولید شود. در بخش بعد در مورد این موضوع بیشتر صحبت خواهیم کرد.

رفع خطا‌ها در جاوا اسکریپت — به زبان ساده

هیچ برنامه‌ای از خطا (باگ) و اشکال خالی نیست. در واقع فرایند توسعه نرم‌افزار، یک روند مداوم مبارزه با اشکال‌ها و باگ‌های برنامه است. خطاهایی که ممکن است در یک برنامه وجود داشته باشند، انواع متفاوتی دارند که در این نوشته تلاش می‌کنیم آن‌ها را در زبان برنامه‌نویسی جاوا اسکریپت بررسی کرده و شما را با روش‌های عیب یابی خطاها آشنا کنیم.

انواع خطا

به طور کلی وقتی با مشکلی در کد خود مواجه می‌شویم، دو نوع عمده خطا ممکن است پیش آمده باشد:

خطاهای نحوی

این نوع خطا در واقع خطاهای املایی در کد هستند که باعث می‌شوند برنامه کلاً کار نکند یا در بخشی از مسیر اجرا دچار توقف شود. در این مورد معمولاً پیام‌های خطایی نیز ارائه می‌شود. رفع این خطاها در صورتی که با ابزارهای مناسب و همچنین معانی پیام‌های خطا آشنا باشید، کار آسانی خواهد بود.

خطاهای منطقی

خطاهایی هستند که در آن ساختار کد صحیح است؛ اما کد، کاری که قرار بوده انجام دهد را انجام نمی‌دهد، یعنی برنامه با موفقیت اجرا می‌شود؛ اما نتایج نادرستی به دست خطاهای رایج در بورس می‌دهد. اصلاح این خطاها معمولاً دشوارتر است، چون پیام‌های خطایی ارائه نمی‌شود که ما را به منبع خطا هدایت کند.

البته همه چیز به این سادگی‌ها نیست، تفاوت‌های دیگری نیز وجود دارند که با عمیق‌تر شدن در این زمینه با آن‌ها مواجه می‌شویم. اما طبقه‌بندی فوق در این مرحله ابتدایی کفایت می‌کند. در ادامه این دو دسته از خطاها را بیشتر بررسی می‌کنیم.

یک مثال خطادار

برای آغاز به کد خطادار زیر از یک بازی که در جاوا اسکریپت کدنویسی شده است، دقت کنید:

در آغاز یک نسخه از کد فوق را در ویرایشگر متنی محبوب خود و همچنین مرورگرتان باز کنید. نسخه آنلاین آن را در این آدرس (+) می‌توانید مشاهده کنید. سعی کنید بازی را اجرا کنید و دکمه «Submit guess» را کلیک کنید، شاهد خواهید بود که بازی اجرا نمی‌شود.

در این زمان اگر به بخش کنسول توسعه‌دهنده مرورگر مراجعه کنیم، در صورت مشاهده هر گونه خطای نحوی می‌توانیم آن‌ها را اصلاح کنیم. روش این کار را در ادامه توضیح می‌دهیم.

اصلاح خطاهای نحوی

برای مراجعه به بخش توسعه‌دهنده کنسول مرورگر می‌توانید از دکمه F12 استفاده کنید. کنسول توسعه‌دهنده هر زمان که خطاهای ساختاری در جاوا اسکریپت وجود داشته باشد، پیش از این که کد وارد موتور جاوا اسکریپت مرورگر شود، پیام‌های خطا را نمایش می‌دهد.

ابتدا به برگه‌ای که فایل مربوطه را باز کرده‌اید بروید و کنسول مرورگر را باز کنید. با پیام خطایی مواجه می‌شوید که به صورت زیر است.

 error message

ردگیری چنین خطاهایی کاملاً آسان است و مرورگر چندین سرنخ مفید برای کمک به شما ارائه می‌کند. تصویر فوق از مرورگر فایرفاکس گرفته شده است؛ اما مرورگرهای دیگر نیز اطلاعات مشابهی ارائه می‌کنند. این اطلاعات از راست به چپ شامل موارد زیر است:

  • یک علامت ضربدر قرمزرنگ که نشان‌دهنده وجود یک خطا است.
  • یک پیام خطا که نشان‌دهنده اشکال مورد نظر است: «TypeError: guessSubmit.addeventListener is not a function»
  • یک لینک «Learn More» که به صفحه MDN شامل توضیح معنای خطا و جزییات فراوان در مورد آن هدایت می‌کند.
  • نام فایل جاوا اسکریپت که به برگه دیباگر devtools لینک شده است. اگر این لینک را دنبال کنید، دقیقاً آن خطی که خطا در آن هایلایت شده است را مشاهده می‌کنید.
  • شماره خطی که خطا در آن قرار دارد و شماره کاراکتر در آن خطی که خطا نخستین بار دیده شده است. در این مورد خط 86 و کاراکتر شماره 3 است.

اگر به خط 86 ویرایشگر کد خود نگاه کنیم، خط زیر را می‌یابیم:

پیام خطا چنین بیان می‌کند: «guessSubmit.addeventListener is not a function». از این رو احتمالاً چیزی را اشتباه ذکر کرده‌ایم. اگر مطمئن نیستید که املای کلمه‌های صحیح است یا بخشی از ساختار اشکال دارد، بهتر است به آن ویژگی در وب‌سایت MDN نگاه کنید. بهترین روش برای انجام این کار جستجوی نام ویژگی به همراه کلمه MDN در موتور جستجو است. در این مورد ما لینک صفحه را ارائه می‌کنیم تا کار شما آسان‌تر شود: ()addEventListener

بنابراین اگر به صفحه فوق نگاه کنید متوجه می‌شوید که ما نام تابع را اشتباه نوشته‌ایم. به خاطر داشته باشید که جاوا اسکریپت به حروف کوچک و بزرگ حساس است. از این رو هر تفاوت جزئی در املای عبارت‌ها موجب بروز خطا می‌شود. تغییر دادن عبارت addeventListener به addEventListener این اشکال را رفع می‌کند و از این رو این کار را هم اینک انجام دهید.

راند دوم خطاهای نحوی

صفحه را ذخیره کرده و مرورگر را رفرش کنید و می‌بینید که خطا از بین رفته است. اینک اگر یک حدس وارد کنید و دکمه «Submit guess» را بزنید با خطای دیگری مواجه خواهید شد.

variable-is-null

این بار خطا به صورت «TypeError: lowOrHi is null» و در خط 78 گزارش شده است. دقت کنید که Null مقدار خاصی است که به معنی «هیچ» یا «بدون مقدار» است. از این رو متغیر lowOrHi اعلان شده و مقداردهی اولیه شده است؛ اما مقدار آن معنی‌داری نیست یعنی نوع یا مقداری ندارد.

همچنین دقت کنید که این خطا به محض بارگذاری صفحه ظاهر نمی‌شود، زیرا این خطا درون یک تابع یعنی درون بلوک < … >()checkGuess رخ می‌دهد. از آنجا که کدهای درون تابع‌ها در حیطه جداگانه‌ای از کدهای بیرون تابع اجرا می‌شوند، این کد اجرا نمی‌شود و از این رو تا زمانی که تابع ()checkGuess در خط 86 اجرا نشود، خطایی صادر نخواهد شد. نگاهی به خط 78 می‌اندازیم و خط کد زیر را می‌بینیم:

در این خط تلاش می‌شود که مشخصه textContent متغیر lowOrHi به صورت یک رشته متنی تعیین شود؛ اما کار نمی‌کند، زیرا lowOrHi شامل آن چیزی که انتظار می‌رود نیست. برای این که دلیل این مسئله را دریابیم به جستجوی موارد دیگر حضور lowOrHi در کد می‌پردازیم. نخستین وهله از این متغیر در خط ۴۶ کد جاوا اسکریپت قرار دارد:

در این مقطع ما تلاش می‌کنیم که یک متغیر شامل ارجاعی به یک عنصر در سند HTML ایجاد کنیم. بررسی می‌کنیم که آیا پس از اجرای این خط متغیر همچنان null است یا نه. کد زیر را در خط 4۷ اضافه کنید:

دقت کنید که ()console.log یک تابع واقعاً مفید برای دیباگ است که مقدار متغیر را در کنسول نشان می‌دهد. بنابراین دستور فوق مقدار متغیر lowOrHi را به محض این که به خط 4۶ کد برسیم در کنسول نمایش می‌دهد.

فایل را ذخیره کرده و صفحه را رفرش کنید. اینک باید نتیجه دستور ()console.log را در کنسول مشاهده کنید.

console-log-output

می‌بینیم که مقدار lowOrHi در این مرحله برابر با null است و از این رو قطعاً مشکلی در خط 4۶ وجود دارد.

اینک باید فکر کنیم که مشکل از چه می‌تواند باشد. خط 4۶ از متد ()document.querySelector استفاده می‌کند که رفرنسی از یک عنصر را با انتخاب کردن آن با سلکتور CSS به دست می‌آورد. اگر فایل را بیشتر بررسی کنیم، می‌توانیم پاراگراف مورد نظر را بیابیم:

بدین ترتیب به یک سلکتور کلاس نیاز داریم که با یک نقطه (.) آغاز شود؛ اما این سلکتور که در خط 4۶ به متد ()querySelector ارسال می‌شود نقطه‌ای ندارد. این می‌تواند یک مشکل باشد. در خط 4۶ lowOrHi را بهlowOrHi. تغییر می‌دهیم.

اکنون اگر فایل را ذخیره و صفحه را رفرش کنیم، می‌بینیم که در کنسول مرورگر عبارت

مورد نظر ما بازگشت می‌یابد. بدین ترتیب خطای دیگری را اصلاح کرده‌ایم. اکنون می‌توانید خط ()console.log را حذف کنید و یا برای ارجاع در موارد آتی آن را حفظ کنید.

راند سوم خطاهای نحوی

اکنون اگر بازی را مجدداً اجرا کنید، شاهد موفقیت بیشتری خواهید بود. بازی به طور کامل بدون هیچ اشکالی تا انتها اجرا می‌شود و فرقی نمی‌کند که حدس شما درست یا نادرست باشد. در این مرحله بازی دوباره از کار می‌افتد و همان خطایی که در ابتدا شاهد بودیم دوباره ایجاد می‌شود:

با این وجود این بار این خطا در خط 94 رخ داده است. اگر به خط 94 نگاه کنیم به سادگی می‌بینیم که همان اشتباه را در این جا نیز مرتکب شده‌ایم. ما یک بار دیگر باید addeventListener را به addEventListener. تغییر دهیم و بنابراین آن را هم اینک انجام می‌دهیم.

یک خطای منطقی

در این مرحله، بازی باید به طور کامل تا آخر به خوبی اجرا شود؛ اما پس از این که چند بار بازی را اجرا کردید بی‌شک متوجه می‌شوید که عدد «تصادفی» که از شما خواسته می‌شود حدس بزنید، همواره 0 یا 1 است. بدیهی است که این آن وضعیتی نیست که ما از یک بازی انتظار داریم. قطعاً مشکلی در منطق بازی در بخشی از این نرم‌افزار وجود دارد، با این حال، بازی خطایی بازنمی‌گرداند و صرفاً به درستی اجرا نمی‌شود.

به دنبال متغیر randomNumber و خطی بگردید که عدد تصادفی نخستین بار تعیین می‌شود. وهله‌ای که عدد تصادفی که باید حدس بزنیم در آن ذخیره می‌شود، در ابتدای بازی و در خط 44 کد قرار دارد:

وهله‌ای که عدد تصادفی را پیش از هر بازی بعدی ایجاد می‌کند در خط 113 قرار دارد:

برای بررسی این که این خطوط موجب ایجاد مشکل هستند یا نه، مجدداً از console.log() کمک می‌گیریم. خط زیر را به طور مستقیم زیر هر یک از دو خط فوق درج کنید:

فایل را ذخیره کرده و صفحه را رفرش کنید. بدین ترتیب می‌بینید که randomNumber در هر نقطه از کد که گزارش می‌گیریم برابر با 1 است.

کار با منطق برنامه

برای اصلاح این مشکل ابتدا باید از طرز کار این خط سر دربیاوریم. بنابراین ابتدا ()Math.random را فراخوانی می‌کنیم که یک عدد اعشاری تصادفی بین 0 و 1 مانند 0.5675493843 تولید می‌کند.

سپس نتیجه فراخوانی ()Math.random را از طریق ()Math.floor فراخوانی می‌کنیم که عدد ارسالی را تا نزدیک‌ترین عدد کامل گرد می‌کند. و در این حالت نتیجه‌ای برابر با 1 به دست می‌آوریم:

گرد کردن یک عدد اعشاری بین 0 و 1 به سمت پایین همواره باعث بازگشت عدد 0 می‌شود و بنابراین افزودن 1 واحد به آن باعث می‌شود به 1 تبدیل شود. در واقع ما باید پیش از آن که عدد را گرد کنیم آن را در 100 ضرب کرده باشیم. در کد زیر خطاهای رایج در بورس یک عدد تصادفی بین 0 و 99 به دست می‌آید:

بدین ترتیب با افزودن مقدار 1، عددی بین 1 و 100 به دست می‌آوریم:

اگر سعی کنیم هر دو خط را مانند حالت فوق به‌روزرسانی کنیم و سپس فایل را ذخیره کرده و رفرش کنیم، به آن منطق بازی که انتظار داریم خواهیم رسید.

خطاهای رایج دیگر

خطاهای متداول دیگری نیز وجود دارند که ممکن است در کد وجود داشته باشند. در این بخش اغلب آن‌ها را بررسی می‌کنیم.

SyntaxError: missing; before statement

این خطا به طور کلی به آن معنا است یک نقطه‌ویرگول در انتهای خطوط کد فراموش شده است؛ اما در برخی موارد نیز ممکن است مسئله از این پیچیده‌تر باشد. برای نمونه اگر این خط را درون تابع ()checkGuess:

به صورت زیر تغییر دهیم:

کد فوق خطایی ایجاد می‌کند. چون فکر می‌کند که شما تلاش می‌کنید کار متفاوتی را انجام دهید. باید اطمینان حاصل کنید که عملگر انتساب (=) که مقدار یک متغیر را انتساب می‌دهد را با عملگر برابری (===) که برابر بودن دو مقدار را بررسی می‌کند، و نتیجه درست/نادرست بازمی‌گرداند، اشتباه نگرفته‌اید.

برنامه صرف نظر از مقداری که وارد می‌کنید، همواره برنده شدن شما را اعلام می‌کند. این مشکل نیز می‌تواند یک نشانه دیگر از استفاده اشتباه از عملگر انتساب به جای عملگر برابری باشد. برای نمونه اگر بخواهیم خط درون ()checkGuess را از حالت زیر:

به حالت زیر تغییر دهیم:

نتیجه آزمون ما همواره مقدار true خواهد بود که موجب می‌شود برنامه گزارش کند که بازیکن برنده شده است، پس باید مراقب این موضوع باشید.

SyntaxError: missing ) after argument list

این خطا کاملاً ساده است و عموماً به این معنا است که پرانتز انتهایی را در پایان فراخوانی یک تابع یا متد فراموش کرده‌اید.

این خطا معمولاً به یک شیء جاوا اسکریپت با شکل نادرست اشاره دارد؛ اما در این مورد می‌توان با تغییر کد از وضعیت زیر

آن را اصلاح نمود.

این کار باعث می‌شود که مرورگر فکر کند که ما می‌خواهیم محتوای تابع را به صورت یک آرگومان به درون تابع ارسال کنیم. بنابراین باید هنگام استفاده از پرانتزها مراقب باشید.

SyntaxError: missing > after function body

این خطاهای رایج در بورس خطا کاملاً ساده است و عموماً به این معنا است که یکی از کروشه‌ها را در ساختار تابع یا شرط فراموش کرده‌اید. این خطا با حذف یکی از کروشه‌های پایانی در انتهای تابع ()checkGuess ایجاد شده است.

SyntaxError: expected expression, got ‘string’ or SyntaxError: unterminated string literal

این خطاها به طور کلی به این معنا هستند که یک گیومه باز یا بسته در یک مقدار رشته‌ای فراموش شده است. در نخستین خطای فوق مقدار string باید با کاراکترهای ناخواسته‌ای که مرورگر به جای علامت گیومه در آغاز رشته یافته است جایگزین شود. خطای دوم به این معنی است که رشته با یک گیومه بسته نشده است.

در مورد همه این خطاها باید به روشی که در مثال‌ها برای مقابله با آن‌ها استفاده کردیم فکر کنید. زمانی که یک خطا رخ می‌دهد به شماره خط نگاه کنید و سپس به آن خط رفته و ببینید آیا می‌توانید مشکل را پیدا کنید یا نه. به یاد داشته باشید که خطا لزوماً در آن خط قرار ندارد و همچنین خطا ممکن است از همان مسئله‌ای که در بخش قبل اشاره کردیم ایجاد نشده باشد.

سخن پایانی

در این نوشته به بررسی مبانی مفاهیم مقدماتی مرتبط با خطاها در برنامه‌های جاوا اسکریپت پرداختیم. البته یافتن خطاها در کد همواره به این سادگی‌ها نیست؛ اما دست‌کم با مطالعه این راهنما و یادگیری مهارت‌های معرفی شده می‌توانید ساعت‌ها در زمان خود برای عیب‌یابی برنامه‌ها صرفه‌جویی کنید و زمانی که برنامه درست کار نمی‌کند، با سرعت بیشتری مشکلات را حل کنید.

اگر این مطلب برایتان مفید بوده است، آموزش‌های زیر نیز به شما پیشنهاد می‌شوند:



اشتراک گذاری

دیدگاه شما

اولین دیدگاه را شما ارسال نمایید.