Difference between revisions of "Python-3.4.3/C4/Handling-Errors-and-Exceptions/English"

From Script | Spoken-Tutorial
Jump to: navigation, search
(Created page with "'''Title of script''': '''Handling errors and exceptions''' '''Author: Arun KP''' '''Keywords: Python, Ipython, error handling, exceptions, debugging, video tutorial''' {|...")
 
Line 24: Line 24:
  
 
* Understand '''errors '''and''' exceptions'''  
 
* Understand '''errors '''and''' exceptions'''  
* Handle '''Errors''' and '''Exceptions'''  
+
* Handle '''errors''' and '''exceptions'''  
 
+
 
+
  
 
|-
 
|-
Line 37: Line 35:
 
* '''Python 3.4.3'''
 
* '''Python 3.4.3'''
 
* '''IPython 5.1.0'''
 
* '''IPython 5.1.0'''
 
 
  
 
|-
 
|-
Line 53: Line 49:
 
|-
 
|-
 
| style="background-color:#ffffff;border:0.5pt solid #000001;padding-top:0cm;padding-bottom:0cm;padding-left:0.097cm;padding-right:0.191cm;"| Slide Errors
 
| style="background-color:#ffffff;border:0.5pt solid #000001;padding-top:0cm;padding-bottom:0cm;padding-left:0.097cm;padding-right:0.191cm;"| Slide Errors
| style="background-color:#ffffff;border:0.5pt solid #000001;padding-top:0cm;padding-bottom:0cm;padding-left:0.097cm;padding-right:0.191cm;"| In Python there are two kinds of errors:  
+
| style="background-color:#ffffff;border:0.5pt solid #000001;padding-top:0cm;padding-bottom:0cm;padding-left:0.097cm;padding-right:0.191cm;"| In '''Python''' there are two kinds of '''errors''':  
  
* '''''syntax errors'' '''and''' '''
+
* '''''syntax errors'''''and  
 
* '''''exceptions'''''
 
* '''''exceptions'''''
 
 
  
 
|-
 
|-
Line 64: Line 58:
  
 
Syntax Error
 
Syntax Error
| style="background-color:#ffffff;border-top:none;border-bottom:0.5pt solid #000001;border-left:0.5pt solid #000001;border-right:0.5pt solid #000001;padding-top:0cm;padding-bottom:0cm;padding-left:0.097cm;padding-right:0.191cm;"| '''Syntax errors '''are caused by incorrect usages and these are detected by parser.
+
| style="background-color:#ffffff;border-top:none;border-bottom:0.5pt solid #000001;border-left:0.5pt solid #000001;border-right:0.5pt solid #000001;padding-top:0cm;padding-bottom:0cm;padding-left:0.097cm;padding-right:0.191cm;"| '''Syntax errors '''are caused by incorrect usages and these are detected by '''parser'''.
  
  
 
For example:
 
For example:
  
if True print'' inside brackets inside double quotes ''done
+
'''if True print'' inside brackets inside double quotes ''done'''
  
  
It will give '''Syntax Error''' since colon is missing after '''True'''.
+
It will give '''Syntax Error''' since '''colon''' is missing after '''True'''.
  
 
|-
 
|-
Line 81: Line 75:
  
  
| style="background-color:#ffffff;border:0.5pt solid #000001;padding-top:0cm;padding-bottom:0cm;padding-left:0.097cm;padding-right:0.191cm;"| Exception is an error that occurs during execution of a program.
+
| style="background-color:#ffffff;border:0.5pt solid #000001;padding-top:0cm;padding-bottom:0cm;padding-left:0.097cm;padding-right:0.191cm;"| '''Exception''' is an '''error''' that occurs during '''execution''' of a '''program'''.
  
  
Python generates an exception that can be handled, which avoids the program to crash.
+
'''Python''' generates an '''exception''' that can be handled, which avoids the '''program''' to crash.
  
  
Line 108: Line 102:
  
  
From here onwards remember to press the Enter key after typing every command.
+
From here onwards remember to press the '''Enter''' key after typing every '''command''' on the '''terminal'''.
  
 
|-
 
|-
Line 128: Line 122:
  
  
It displays an ‘arrow’ pointing at the earliest point in the line where the error was detected.
+
It displays an ‘arrow’ pointing at the earliest point in the line where the '''error''' was detected.
  
  
Line 149: Line 143:
 
|-
 
|-
 
| style="background-color:#ffffff;border:0.5pt solid #000001;padding-top:0cm;padding-bottom:0cm;padding-left:0.097cm;padding-right:0.191cm;"|  
 
| style="background-color:#ffffff;border:0.5pt solid #000001;padding-top:0cm;padding-bottom:0cm;padding-left:0.097cm;padding-right:0.191cm;"|  
| style="background-color:#ffffff;border:0.5pt solid #000001;padding-top:0cm;padding-bottom:0cm;padding-left:0.097cm;padding-right:0.191cm;"| '''Exception''' is a special kind of failure reported by the '''programming''' '''language'''.  
+
| style="background-color:#ffffff;border:0.5pt solid #000001;padding-top:0cm;padding-bottom:0cm;padding-left:0.097cm;padding-right:0.191cm;"| '''Exception''' is a special kind of failure reported by the '''programming language'''.  
  
 
|-
 
|-
Line 159: Line 153:
  
 
'''num = int(a)'''
 
'''num = int(a)'''
| style="background-color:#ffffff;border:0.5pt solid #000001;padding-top:0cm;padding-bottom:0cm;padding-left:0.097cm;padding-right:0.191cm;"| Lets see how can we deal with '''Exceptions '''that occur in programs.
+
| style="background-color:#ffffff;border:0.5pt solid #000001;padding-top:0cm;padding-bottom:0cm;padding-left:0.097cm;padding-right:0.191cm;"| Let's see how can we deal with '''Exceptions '''that occur in '''programs'''.
  
  
Line 174: Line 168:
 
|-
 
|-
 
| style="background-color:#ffffff;border:0.5pt solid #000001;padding-top:0cm;padding-bottom:0cm;padding-left:0.097cm;padding-right:0.191cm;"| Point to the error
 
| style="background-color:#ffffff;border:0.5pt solid #000001;padding-top:0cm;padding-bottom:0cm;padding-left:0.097cm;padding-right:0.191cm;"| Point to the error
| style="background-color:#ffffff;border:0.5pt solid #000001;padding-top:0cm;padding-bottom:0cm;padding-left:0.097cm;padding-right:0.191cm;"| When you run this code, it throws a ''''ValueError'''' '''Exception'''.
+
| style="background-color:#ffffff;border:0.5pt solid #000001;padding-top:0cm;padding-bottom:0cm;padding-left:0.097cm;padding-right:0.191cm;"| When you run this code, it throws a ''''ValueError' Exception'''.
  
  
This is because, we are trying to convert the string to integer.
+
This is because, we are trying to convert the '''string''' to '''integer'''.
  
 
|-
 
|-
 
| style="background-color:#ffffff;border:0.5pt solid #000001;padding-top:0cm;padding-bottom:0cm;padding-left:0.097cm;padding-right:0.191cm;"|  
 
| style="background-color:#ffffff;border:0.5pt solid #000001;padding-top:0cm;padding-bottom:0cm;padding-left:0.097cm;padding-right:0.191cm;"|  
| style="background-color:#ffffff;border:0.5pt solid #000001;padding-top:0cm;padding-bottom:0cm;padding-left:0.097cm;padding-right:0.191cm;"| So now we can ''''catch'''' '''exceptions''' and write '''code''' to '''handle''' it.  
+
| style="background-color:#ffffff;border:0.5pt solid #000001;padding-top:0cm;padding-bottom:0cm;padding-left:0.097cm;padding-right:0.191cm;"| So now we can ''''catch exceptions''' and write '''code''' to '''handle''' it.  
  
  
For this we have '''try''' and '''except''' '''clause''' in '''python'''.
+
For this we have '''try''' and '''except clause''' in '''Python'''.
  
 
|-
 
|-
Line 197: Line 191:
  
 
'''statement2'''
 
'''statement2'''
 +
| style="background-color:#ffffff;border:0.5pt solid #000001;padding-top:0cm;padding-bottom:0cm;padding-left:0.097cm;padding-right:0.191cm;"| Here is the syntax of '''''try....except...else'' blocks'''.
  
 +
 +
First, the '''statements''' between the '''try''' and '''except keywords''' is executed.
 +
 +
|-
 +
| style="background-color:#ffffff;border:0.5pt solid #000001;padding-top:0cm;padding-bottom:0cm;padding-left:0.097cm;padding-right:0.191cm;"|
 
'''except exception name:'''
 
'''except exception name:'''
  
 
'''exception handling statement(s)'''
 
'''exception handling statement(s)'''
 +
| style="background-color:#ffffff;border:0.5pt solid #000001;padding-top:0cm;padding-bottom:0cm;padding-left:0.097cm;padding-right:0.191cm;"| If the '''statements''' do not cause any '''exception''', the '''except clause''' is skipped.
  
'''else:'''
 
  
'''statement(s) when no exception'''
+
If the '''statements''' cause any '''exception''', then '''except clause''' is executed if '''exception''' name matches.
  
 +
And the '''execution''' continues after the '''try statement'''.
  
'''after statement(s)'''
+
|-
 +
| style="background-color:#ffffff;border:0.5pt solid #000001;padding-top:0cm;padding-bottom:0cm;padding-left:0.097cm;padding-right:0.191cm;"|'''else:'''
  
 +
'''statement(s) when no exception'''
  
Highlight according to narration
 
  
 
+
'''after statement(s)'''
 
+
| style="background-color:#ffffff;border:0.5pt solid #000001;padding-top:0cm;padding-bottom:0cm;padding-left:0.097cm;padding-right:0.191cm;"| The '''code''' in the '''else-block executes''' if the '''code''' in the '''try: block''' does not raise an '''exception'''.
| style="background-color:#ffffff;border:0.5pt solid #000001;padding-top:0cm;padding-bottom:0cm;padding-left:0.097cm;padding-right:0.191cm;"| Here is the syntax of '''''try....except...else'' '''blocks.
+
 
+
 
+
First, the statements between the [https://docs.python.org/3/reference/compound_stmts.html#try try] and [https://docs.python.org/3/reference/compound_stmts.html#except except] keywords is executed.
+
 
+
 
+
If the statements do not cause any exception, the except clause is skipped.
+
 
+
 
+
If the statements cause any exception, then except clause is executed if exception name matches.
+
 
+
And the execution continues after the try statement.
+
 
+
 
+
The code in the else-block executes if the code in the try: block does not raise an exception.
+
  
 
|-
 
|-
Line 253: Line 240:
  
  
Give '''ac''' as input.
+
Give '''ac''' as '''input'''.
  
Now we will type the try and except blocks.
+
Now we will type the '''try''' and '''except blocks.'''
  
  
Press Enter twice to get the output.
+
Press '''Enter''' twice to get the '''output'''.
  
  
 
In the previous example,
 
In the previous example,
  
We encountered a problem because we tried to convert the string '''‘ac’''' to integer.  
+
We encountered a problem because we tried to convert the '''string ‘ac’''' to '''integer'''.  
  
  
Here conversion of string value to an integer is given inside '''try block'''.
+
Here conversion of '''string value''' to an '''integer''' is given inside '''try block'''.
  
  
'''ValueError''' exception is raised and so the output is displayed as '''Wrong input.'''
+
'''ValueError exception''' is raised and so the '''output''' is displayed as '''Wrong input.'''
  
 
|-
 
|-
 
| style="background-color:#ffffff;border:0.5pt solid #000001;padding-top:0cm;padding-bottom:0cm;padding-left:0.097cm;padding-right:0.191cm;"|  
 
| style="background-color:#ffffff;border:0.5pt solid #000001;padding-top:0cm;padding-bottom:0cm;padding-left:0.097cm;padding-right:0.191cm;"|  
| style="background-color:#ffffff;border:0.5pt solid #000001;padding-top:0cm;padding-bottom:0cm;padding-left:0.097cm;padding-right:0.191cm;"| In the previous example, we found out what caused the error and then resolved to get a solution for it.  
+
| style="background-color:#ffffff;border:0.5pt solid #000001;padding-top:0cm;padding-bottom:0cm;padding-left:0.097cm;padding-right:0.191cm;"| In the previous example, we found out what caused the '''error''' and then resolved to get a solution for it.  
  
  
Line 280: Line 267:
 
|-
 
|-
 
| style="background-color:#ffffff;border:0.5pt solid #000001;padding-top:0cm;padding-bottom:0cm;padding-left:0.097cm;padding-right:0.191cm;"|  
 
| style="background-color:#ffffff;border:0.5pt solid #000001;padding-top:0cm;padding-bottom:0cm;padding-left:0.097cm;padding-right:0.191cm;"|  
| style="background-color:#ffffff;border:0.5pt solid #000001;padding-top:0cm;padding-bottom:0cm;padding-left:0.097cm;padding-right:0.191cm;"| Next we will see another case in try except statement with else clause.
+
| style="background-color:#ffffff;border:0.5pt solid #000001;padding-top:0cm;padding-bottom:0cm;padding-left:0.097cm;padding-right:0.191cm;"| Next we will see another '''case''' in '''try except statement''' with '''else clause'''.
  
 
|-
 
|-
Line 303: Line 290:
  
 
Highlight '''No exception '''
 
Highlight '''No exception '''
| style="background-color:#ffffff;border:0.5pt solid #000001;padding-top:0cm;padding-bottom:0cm;padding-left:0.097cm;padding-right:0.191cm;"| Lets change our previous code slightly.  
+
| style="background-color:#ffffff;border:0.5pt solid #000001;padding-top:0cm;padding-bottom:0cm;padding-left:0.097cm;padding-right:0.191cm;"| Lets change our previous '''code''' slightly.  
  
  
Line 309: Line 296:
  
  
I will give input as 23.
+
I will give '''input''' as 23.
  
  
Line 315: Line 302:
  
  
This''' try… except''' statement has an optional '''else''' clause.
+
This''' try… except statement''' has an optional '''else clause'''.
  
  
It is useful if the try clause does not raise an exception.
+
It is useful if the '''try clause''' does not raise an '''exception'''.
  
 
|-
 
|-
| style="background-color:#ffffff;border:0.5pt solid #000001;padding-top:0cm;padding-bottom:0cm;padding-left:0.097cm;padding-right:0.191cm;"| Open a text editor and type the following code  
+
| style="background-color:#ffffff;border:0.5pt solid #000001;padding-top:0cm;padding-bottom:0cm;padding-left:0.097cm;padding-right:0.191cm;"| Open a '''text editor''' and type the following '''code'''.
  
  
Line 335: Line 322:
  
 
Save it as file '''mymodule.py'''  
 
Save it as file '''mymodule.py'''  
| style="background-color:#ffffff;border:0.5pt solid #000001;padding-top:0cm;padding-bottom:0cm;padding-left:0.097cm;padding-right:0.191cm;"| Lets see another example for debugging.  
+
| style="background-color:#ffffff;border:0.5pt solid #000001;padding-top:0cm;padding-bottom:0cm;padding-left:0.097cm;padding-right:0.191cm;"| Lets see another example for '''debugging'''.  
  
  
Create a '''file''' with the following '''code'''.
+
Create a file '''mymodule.py''' with the following '''code'''.
  
  
The variable ‘i’ is iterated from 0 to 9.
+
The '''variable ‘i’''' is iterated from 0 to 9.
 
+
 
+
Save it as '''mymodule.py'''
+
  
 
|-
 
|-
Line 355: Line 339:
  
  
| style="background-color:#ffffff;border:0.5pt solid #000001;padding-top:0cm;padding-bottom:0cm;padding-left:0.097cm;padding-right:0.191cm;"| Let us run this code in Ipython.
+
| style="background-color:#ffffff;border:0.5pt solid #000001;padding-top:0cm;padding-bottom:0cm;padding-left:0.097cm;padding-right:0.191cm;"| Let us '''run''' this '''code''' in '''Ipython'''.
  
  
Line 365: Line 349:
  
  
'''Interpreter''' gives us an '''ZeroDivisionError''' because there is a''' division by zero error'''.  
+
'''Interpreter''' gives us '''ZeroDivisionError''' because there is a''' division by zero error'''.  
  
 
|-
 
|-
Line 377: Line 361:
  
 
Highlight ipdb>
 
Highlight ipdb>
| style="background-color:#ffffff;border:0.5pt solid #000001;padding-top:0cm;padding-bottom:0cm;padding-left:0.097cm;padding-right:0.191cm;"| To find the value which caused the error, type this
+
| style="background-color:#ffffff;border:0.5pt solid #000001;padding-top:0cm;padding-bottom:0cm;padding-left:0.097cm;padding-right:0.191cm;"| To find the value which caused the '''error''', type this
  
  
Line 383: Line 367:
  
  
The code which caused the error is shown by an arrow.
+
The '''code''' which caused the '''error''' is shown by an arrow.
  
  
Line 395: Line 379:
  
 
'''5'''
 
'''5'''
| style="background-color:#ffffff;border:0.5pt solid #000001;padding-top:0cm;padding-bottom:0cm;padding-left:0.097cm;padding-right:0.191cm;"| Using this '''debugger''' here, you can access variables in the previous code block.
+
| style="background-color:#ffffff;border:0.5pt solid #000001;padding-top:0cm;padding-bottom:0cm;padding-left:0.097cm;padding-right:0.191cm;"| Using this '''debugger''' here, you can access '''variables''' in the previous '''code block'''.
  
  
We can check values of variable to inspect what went wrong.
+
We can check values of '''variables''' to inspect what went wrong.
  
  
Line 404: Line 388:
  
  
This means that the error was caused when the value of i became 5.
+
This means that the '''error''' was caused when the value of '''i''' became 5.
  
  
To exit from the '''ipdb''' '''prompt''', press '''q '''and press '''Enter'''.
+
To exit from the '''ipdb prompt''', press '''q '''and press '''Enter'''.
  
 
|-
 
|-
Line 420: Line 404:
 
* '''Errors '''and''' exceptions'''.
 
* '''Errors '''and''' exceptions'''.
 
* Handling '''exception''' using '''try''' and '''except'''.  
 
* Handling '''exception''' using '''try''' and '''except'''.  
* Using ''percentage '''''debug''' for '''debugging''' in '''ipython'''.  
+
* Using '''''percentage ''debug''' for '''debugging''' in '''ipython'''.  
 
+
 
+
  
 
|-
 
|-
Line 430: Line 412:
 
| style="background-color:#ffffff;border:0.5pt solid #000001;padding-top:0cm;padding-bottom:0cm;padding-left:0.097cm;padding-right:0.191cm;"| Here is a self assessment question for you to solve  
 
| style="background-color:#ffffff;border:0.5pt solid #000001;padding-top:0cm;padding-bottom:0cm;padding-left:0.097cm;padding-right:0.191cm;"| Here is a self assessment question for you to solve  
  
'''1. '''How do you start the''' debugger '''on''' ipython?'''  
+
#How do you start the''' debugger '''on''' ipython?'''  
  
 
|-
 
|-
Line 436: Line 418:
  
 
Solutions
 
Solutions
| style="background-color:#ffffff;border:0.5pt solid #000001;padding-top:0cm;padding-bottom:0cm;padding-left:0.097cm;padding-right:0.191cm;"| And the answer,  
+
| style="background-color:#ffffff;border:0.5pt solid #000001;padding-top:0cm;padding-bottom:0cm;padding-left:0.097cm;padding-right:0.191cm;"| And the answer,
 
+
# We start the debugger on ipython by saying, p''ercentage '''''debug'''
+
 
+
  
 +
# We start the '''debugger''' on '''ipython''' by saying, '''percentage ''debug'''
  
 
|-
 
|-

Revision as of 09:06, 23 October 2018

Title of script: Handling errors and exceptions

Author: Arun KP

Keywords: Python, Ipython, error handling, exceptions, debugging, video tutorial


Visual Cue Narration
Show Slide title Welcome to the spoken tutorial on Handling errors and exceptions.
Show Slide

Objectives


In this tutorial, you will learn to,
  • Understand errors and exceptions
  • Handle errors and exceptions
Show Slide

System Specifications

To record this tutorial, I am using
  • Ubuntu Linux 16.04 operating system
  • Python 3.4.3
  • IPython 5.1.0
Show Slide

Prerequisite

To practise this tutorial, you should know how to
  • use functions and
  • carry-out testing and debugging

If not, see the relevant Python tutorials on this website.

Slide Errors In Python there are two kinds of errors:
  • syntax errorsand
  • exceptions
Show Slide

Syntax Error

Syntax errors are caused by incorrect usages and these are detected by parser.


For example:

if True print inside brackets inside double quotes done


It will give Syntax Error since colon is missing after True.

Show Slide

Exceptions


Exception is an error that occurs during execution of a program.


Python generates an exception that can be handled, which avoids the program to crash.


For example:

1/0


It will give ZeroDivisionError exception.

Open terminal Let us see these examples in action.


Open the terminal.

Type,

ipython3

Type ipython3 and press Enter.


From here onwards remember to press the Enter key after typing every command on the terminal.

Type,

if True print("done")


Highlight the arrow mark


Now type

if True print inside brackets inside double quotes done


The output shows SyntaxError.


It displays an ‘arrow’ pointing at the earliest point in the line where the error was detected.


In our case, the error is caused by missing colon after True in If clause

Type,

1 / 0

Now type,

1 / 0


Python throws an exception called ZeroDivisionError.


Even though the expression is syntactically correct, we cannot divide a number by zero.

Exception is a special kind of failure reported by the programming language.
Type,

a = input("Enter a number: ")

Enter ac

num = int(a)

Let's see how can we deal with Exceptions that occur in programs.


Type

a = input inside brackets inside double quotes Enter an integer


I will enter ac as input.


Now type, num is equal to int inside brackets a

Point to the error When you run this code, it throws a 'ValueError' Exception.


This is because, we are trying to convert the string to integer.

So now we can 'catch exceptions and write code to handle it.


For this we have try and except clause in Python.

[slide]

try..except..else


try:

statement1

statement2

Here is the syntax of try....except...else blocks.


First, the statements between the try and except keywords is executed.

except exception name:

exception handling statement(s)

If the statements do not cause any exception, the except clause is skipped.


If the statements cause any exception, then except clause is executed if exception name matches.

And the execution continues after the try statement.

else:

statement(s) when no exception


after statement(s)

The code in the else-block executes if the code in the try: block does not raise an exception.
Type,

a = input("Enter an integer: ")

ac

try:

num = int(a)

except ValueError:

print ("Wrong input")

Press Enter twice

output:

Wrong input

Type as shown.


Give ac as input.

Now we will type the try and except blocks.


Press Enter twice to get the output.


In the previous example,

We encountered a problem because we tried to convert the string ‘ac’ to integer.


Here conversion of string value to an integer is given inside try block.


ValueError exception is raised and so the output is displayed as Wrong input.

In the previous example, we found out what caused the error and then resolved to get a solution for it.


This whole process is called debugging.

Next we will see another case in try except statement with else clause.
b = input("Enter an integer: ")

23

try:

num = int(b)

except ValueError:

print ("Wrong input")

else:

print(“No exception “)

Press Enter twice


Highlight No exception

Lets change our previous code slightly.


Type as shown.


I will give input as 23.


Now type as shown.


This try… except statement has an optional else clause.


It is useful if the try clause does not raise an exception.

Open a text editor and type the following code.


def test():

prod = 1

for i in range(0, 10):

prod *= i / (i - 5)

print(prod)

Save it as file mymodule.py

Lets see another example for debugging.


Create a file mymodule.py with the following code.


The variable ‘i’ is iterated from 0 to 9.

Type,

from mymodule import test

test()


Let us run this code in Ipython.


Type,

from mymodule import test

test open and close brackets


Interpreter gives us ZeroDivisionError because there is a division by zero error.

Type,

%debug


Highlight the arrow mark


Highlight ipdb>

To find the value which caused the error, type this


Percentage debug


The code which caused the error is shown by an arrow.


The prompt has changed to ipdb which is the ipython debugger mode.

[IPython Terminal]


ipdb> i

5

Using this debugger here, you can access variables in the previous code block.


We can check values of variables to inspect what went wrong.


For example, on typing ‘i’, we get 5 as output.


This means that the error was caused when the value of i became 5.


To exit from the ipdb prompt, press q and press Enter.

Show Slide

Summary

This brings us to the end of this tutorial. Let us summarize.


In this tutorial, we have learnt about

  • Errors and exceptions.
  • Handling exception using try and except.
  • Using percentage debug for debugging in ipython.
Show Slide

Self assessment questions

Here is a self assessment question for you to solve
  1. How do you start the debugger on ipython?
Show Slide

Solutions

And the answer,
  1. We start the debugger on ipython by saying, percentage debug
Show Slide Forum Please post your timed queries in this forum.
Show Slide Fossee Forum Please post your general queries on Python in this forum.
Slide Textbook Companion FOSSEE team coordinates the TBC project.
Show Slide

Acknowledgment


Spoken Tutorial Project is funded by NMEICT, MHRD, Govt. of India.

For more details, visit this website.

Previous slide This is Priya from IIT Bombay signing off.

Thank you.

Contributors and Content Editors

Nancyvarkey, Priyacst